今天写代码的时候发现了个bug,而且是非常奇怪的bug。因为float类型的数据A在cout以后显示的值明明是等于B的,可计算机判断A
为了弄明白这是怎么回事,问了同学以后大概知道问题出在cout的precision上。由于精度的限制,cout 跟 printf 类似,打印出来的值并不一定完全等于它的实际值。
事实表明的确是这样的。比如,A = 50.4999994,B = 50.5,显示A
通过在网上仔细查资料学习,明白了为什么。原文总结得已经很全面了,所以直接贴过来。原文转自这里
先写写自己的几点总结:
1、setprecision(n):
表示保留n位有效数字,其中最后一位是四舍五入之后的结果;默认情况下n=6
所以对于50.4999994,如果n<9,cout 打印出来的数值都是50.5,后面的零会省去不打印。
2、如果加上showpoint,后面的零就不省略了。
3、ios::fixed 是用来控制小数点后面的打印数字个数的。
转载正文:
首先要加头文件:iomanip
一:setprecision
作用:控制输出流显示浮点数的数字个数,setprecision(n)就是输出的n个数,会有四舍五入。
比如:double s=20.7843000,
cout<
cout<
cout<
cout<
cout<
cout<
可见,小数部分末尾为0时,是输不出来的!
要想输出来,就得用showpoint了。
特别提示:
(如果再在这些语句后面加个两个语句:
cout<<1<
cout<<1.00800<
猜到会输出什么吗?
第一条输出:1。不是浮点型。
第二条为:1.008。承接setprecision(8)的这条规则语句。
注:
如果直接有语句
int main()
{
cout<<1<
cout<<1.00<
}
第一条输出:1。
第二条也为:1。按整型输出
)
二:setprecision与showpoint
语法:在输出语句前声明:cout.setf(ios::showpoint);就行了!
还比如:double s=20.7843000,
cout.setf(ios::showpoint);
cout<
cout<
cout<
cout<
cout<
cout<
可见,就会输出想要的数据数目!
特别提示:
(如果再在这些语句后面加个两个语句:
cout<<1<
cout<<1.0080<
猜到会输出什么吗?
第一条输出:1。不是浮点型。
第二条也为:1.0080000。承接setprecision(8)的这条规则语句。
三:setprecision与fixed
如果想要保留几位小数,那setprecision就得与fixed合作了!!
语法:在输出语句前声明:cout.setf(ios::fixed);
比如:double s=20.7843909
cout.setf(ios::fixed);
cout<
cout<
cout<
cout<
cout<
cout<
特别提示:
(如果也再在这些语句后面加个两个语句:
cout<<1<
cout<<1.008<
猜到会输出什么吗?
第一条输出:1。
第二条为:1.00800000。
就是承接了setprecision(8)的这条规则语句,是浮点型的都会保留8个小数。是整型的还是整型!)
语句也可以写成:cout<
就算后面的语句没有写<
比如有语句:
cout<
A:cout<
B:cout<
AB语句均会按保留7个,8个小数处理,不会再按有7或8个浮点数处理。
如果下面有语句c:
cout<<1.008<
四:setprecision、showpoint与fixed
{cout<
比如:double s=20.7843909
1.有语句
cout<
cout<
2.有语句:
cout<
cout<
3.有语句:
cout<
cout<
5.有语句:
cout<