当cout一些位数较多的数字时,大家可能都遇到过以下三种情况
//类型一:整数位很多
double x=12345678;
//类型二:小数位很多,有效小数位少
double y=0.00001234;
//类型三:小数位很多,有效小数位也多
double z=3.1415926;
cout<<x<<endl;
cout<<y<<endl;
cout<<z<<endl;
运行结果如下:
1.23457e+07
1.234e-05
3.14159
前两个数采用了科学记数法(scientific notation),第三个数保留了5位小数。
相信大家可以从这三个例子看出,三个数数据类型都是double, 而不是整数型。
那么整数型会出现什么情形呢?
//注意不要太大,使其溢出
int x=12345678;
cout<<x<<endl;
运行结果如下
12345678
对比之前的double类型
double x=12345678;
cout<<x<<endl;
输出结果是
1.23457e+07
由此我们可以发现浮点数有其独特的输出方式,即会在一定情况下使用科学记数法,int就没有哟。
那么根据http://www.cplusplus.com/reference/ios/defaultfloat/
的内容加我们的实验,可以总结出一些浮点数输出默认的规则。
Use default floating-point notation
Sets the floatfield format flag for the str stream to defaultfloat.
When floatfield is set to defaultfloat, floating-point values are written using the default notation: the representation uses as many meaningful digits as needed up to the stream’s decimal precision (precision), counting both the digits before and after the decimal point (if any).
意思就是说,把一个叫floatflied的格式标示设置为defaultfloat使,浮点数用默认记数法编写:这种表示方法尽可能用多的位数,这个位数包括小数点前及小数点后的位数。
For standard streams, the floatfield format flag is set to this value (defaultfloat) on initialization.
初始情况下(即未手动给floatfield赋值的时),也就是说floatflied默认值就是defaultfloat。
默认记数法有什么特点呢?
1)保留有效位至多6位(有效位包括小数点前的位数,正如上文译文提到的)
请回看引言举例里的类型三!
知道大家懒。。
//类型三:小数位很多,有效小数位也多
double z=3.1415926;
cout<<z<<endl;
输出结果是
3.14159
此处,截取数字的规则是四舍五入!!!(请记住这一点,下文要用到)
当然,如果浮点数本来就位数很少,比如0.5,输出就是0.5,不会用0补齐到6位有效数字。
2)删去无效位数(也算是第一点的进一步说明)
double x=2.0;
cout<<x<<endl;
输出结果
2
这里举一个有意思的例子!!
double x=1.234595;
cout<<x<<endl;
大家先想想,保留六位数字应该输出什么!!
答案是
1.2346
诶诶,为什么不是六位!!
先截取6位,下一位要四舍五入,而下一位是5,要进位,而上一位恰恰是9,9+1=10,要再往前一位加一,即4要加一,本应该输出1.23460,但是末尾的0不算是有效数位,根据规则二(本规则)要删去,即输出1.2346这个有效数位5位的数啦!!
3)适当情况下会用科学记数法(scientific notation)
请看引言的情况一,情况二!!!
好吧,我搬过来。
//类型一:整数位很多
double x=12345678;
//类型二:小数位很多,有效小数位少
double y=0.00001234;
cout<<x<<endl;
cout<<y<<endl;
输出结果是:
1.23457e+07
1.234e-05
那么如何消除浮点数的科学计数法呢?
答案是用fixed,一个manipulator。
//类型一:整数位很多
double x=12345678;
//类型二:小数位很多,有效小数位少
double y=0.00001234;
cout<<fixed<<x<<endl;
cout<<fixed<<y<<endl;
输出结果是:
12345678.000000
0.000012
其实只要出现了fixed,则后面都是以fixed输出。
那么只需要写
cout<<fixed<<x<<endl;
cout<<y<<endl;//之后不用再打一遍fixed了
特点是:无科学记数法而且小数点后的位数是6位!!!
其实看fixed难道不眼熟吗??
上一篇博客讲到了定点数和浮点数的区别,定点数就是fixed-point number呀!!
这里的fixed也是指"write floating-point values in fixed-point notation",用定点表示法表示浮点数!!
相信大家都知道,fixed与setprecision(n)连用可以控制小数点后的位数,现在就可以理解因为那是定点数记数法。
如果没有fixed的话,就是浮点数记数法了,那么它控制的应该就是有效数字的位数(包括小数点前的)!!!!!
大家应该很清楚了,但还是举个例子吧。
double x = 0.123456;
double y = 1.123456;
cout << x << endl;
cout << y << endl;
0.123456
1.12346
若想用setw(int n)呢,要加头文件 < iomanip > [io+manipulator的意思]
其控制后面输出的长度,默认右对齐,输出内容长度不够用空格补齐,输出内容长度超过则正常输出。
注:1. setw()只对后面紧跟的输出有限制。
2. 标点符号占一位!
double x = 0.1;
double y = 0.123456;
cout <<setw(7)<< x << endl;
cout << x << endl;
cout << setw(3)<<y << endl;
输出结果是
0.1
0.1
0.123456
感谢阅读。欢迎读者们指正错误或提问!