C++中浮点数的输出方式有:
- 定点输出法:我们平常日常生活中书写小数的方法,小数点不能随便移动,如3.1415926、123456.789;
//设置浮点数按定点方式输出 std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
- 科学计数输出法:将一个浮点数写成一个数乘以10的n次方的形式,如123456.789可以写成1.23456789乘以10的5次方,0.618可以写成6.18乘以10的-1次方,在C++中分别表示为:1.23456789e5、6.18e-1;
//设置浮点数按科学计数方式输出 std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield);
- 默认输出方式:当输出方式设置成定点或科学计数法时,按默认方式进行浮点数输出,基础其输出方式为:根据输出的数值不同自动选择定点或科学计数方式之一输出,下一节会深入讨论默认输出方式时自动选择“定点”或“科学计数法”的规则。
//设置浮点数按默认方式输出 std::cout.setf(0, std::ios_base::floatfield);
设置了cout的浮点数输出方式后,会一直影响cout以后的浮点数输出方式,直到设置了新的输出方式。
默认输出方式时自动选择“定点”或“科学计数法”的规则:
在C++中,如果没有指定输出方式(定点或科学计数法)浮点数会根据输出的值自动选择输出方式。浮点数的默认输出精度包含6个有效数字(小数点与末尾的 0 不占用6个精度的位置),小数点后末尾的 0 不输出。
- 如果浮点数的整数部分长度小于或等于 6,则用定点(fixed)表示法,小数位数为【6 - 整数部分长】,如3.14,整数部分只有数字 3,长度为 1,则小数部分应该有 6 - 1 = 5位,但是【14】后面都是0,默认不显示,因此会输出3.14;再有123456.789,整数部分为 123456,长度为 6 位,小数部分位数应该是 6 - 6 = 0位,则输出为123457(最后一位四舍五入)。
- 注意:当整数部分为 0 时,整数部分不占有效位长度,如0.123456789会输出 0.123457(6位小数)。
- 如果浮点数的整数部分长度大于6,则用科学计数法(scientific)表示,如1234567.89,它的整数部分为 1234567,长度为 7,大于 6,因此采用科学计数法,输出 1.23457e+006(注:e后面的部分在不同编译器下显示可能不相同)。
- 总结:在默认情况下,浮点数输出会根据浮点数的整数部分长度,自动选择使用科学计数法或定点表示法来进行输出。
设置精度位数
语法:cout.precision(精度值),如设置精度为9,使用 cout.precision(9);
精度的两种不同情况:
- 情况1:当使用默认的输出方式(未设置成定点或科学计数法输出方式)时,精度表示有效的数字个数,会按上一节【默认输出方式的选择办法】中的方式进行输出;
- 情况2:当设置了定点或科学计数法时,精度表示小数点后的位数,不足精度位时,在末尾补上相应个数的 0。
设置了cout的浮点数输出精度后,会一直影响cout以后的浮点数输出精度,直到设置了新的输出精度。
实例:
#include <iostream>
int main()
{
using std::cout;
using std::endl;
//默认输出方式,整数位数长为6,等于默认精度6,按定点法输出:123457
//最后一位四舍五入
cout << 123456.789 << endl;
//设置精度为 8,输出方式没有变,还是默认的自动选择输出方式
//此处精度并不是小数点后8位,而是8个有效数字
cout.precision(8);
//默认输出方式:整数位数长为6,小于默认精度8,小数位数为8-6=2
//按定点法输出:123456.79,最后一位四舍五入
cout << 123456.789 << endl;
//默认输出方式,因为整数部分为0,所以整数部分的数位长度为0,小于默认精度8
//小数位数为8-0=8按定点法输出:0.12345679
cout << 0.123456789 << endl;
//设置精度为 4,输出方式没有变,还是默认的自动选择输出方式
//此处精度并不是小数点后4位,而是4个有效数字
cout.precision(4);
//默认输出方式:整数部分的数位长度为5,大于设置精度4
//按科学计数法输出:1.235e+004(e后面部分,在不同编译器下的输出可能不同)
cout << 12345.6789 << endl;
//用old变量保存当前正在使用的输出方式(也就是默认输出方式),并设置输出方式为定点方式,
std::ios_base::fmtflags old = cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
//输出方式为定点输出方式,精度表示小数点后的位数,精度长是前面设置的4
//按定点法输出:1234.5679
cout << 1234.56789 << endl;
//设置输出方式为科学计数法方式,精度表示小数点后的位数,精度长是前面设置的4
cout.setf(std::ios_base::scientific, std::ios_base::floatfield);
//按科学计数法输出:1.2346e+003(不同编译器下的输出可能不同)
cout << 1234.56789 << endl;
//按科学计数法输出:整数部分为0,则将整数部分设置成大于0且小于10的数,
//输出1.2346e-002
cout << 0.0123456789 << endl;
//恢复默认输出方式:自动选择输出方式,但是精度不变,仍然为前面设置的4
//但是现在的精度表示“有效数字个数”
cout.setf(old, std::ios_base::floatfield);
//整数部分长为7,大于精度4,选择科学计数法输出:1.235e+006
cout << 1234567.89<< std::endl;
getchar();
}