详解C++中fixed,setprecision(),setw()的用法

引言

当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

那么如何消除浮点数的科学计数法呢?
答案是用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",用定点表示法表示浮点数!!

setprecision()

相信大家都知道,fixed与setprecision(n)连用可以控制小数点后的位数,现在就可以理解因为那是定点数记数法。

如果没有fixed的话,就是浮点数记数法了,那么它控制的应该就是有效数字的位数(包括小数点前的)!!!!!

大家应该很清楚了,但还是举个例子吧。


	double x = 0.123456;
	double y = 1.123456;

	cout  << x << endl;
	cout << y << endl;
	
0.123456
1.12346

setw()

若想用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

感谢阅读。欢迎读者们指正错误或提问!

  • 209
    点赞
  • 566
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值