为何C++变量d3存储的值比直接计算的实际结果小1?
为什么变量d3的值比直接输出的计算结果小1?
先看你给出的代码片段:
d = 92.345; //it is of double type scnt = 92; //it is of int type //cout<<scnt; int d1 = (d-scnt)*10; int d2 = ((d-scnt)*100)-(d1*10); int d3 = ((d-scnt)*1000) - ((d1*100)+d2*10);//same equation if we print in cout gives actual answer bool f1, f2; cout<<"original value : "<<((d-scnt)*1000) - ((d1*100)+d2*10)<<endl; cout<<"d3 : "<<d3<<endl;
这个问题的核心原因其实是浮点数的二进制精度限制——这是C++(以及几乎所有编程语言)里浮点数的常见“陷阱”。
具体拆解一下:
- 你定义的
d = 92.345,看起来是个规整的十进制小数,但在double类型的二进制存储里,它没办法被精确表示。实际存储的是一个非常接近92.345,但略小于它的近似值(比如类似92.344999999999991这样的数)。 - 第一步计算
d - scnt,得到的是略小于0.345的值,比如0.344999999999991。 - 当你把
(d-scnt)*10赋值给int类型的d1时,会直接截断小数部分(不是四舍五入),所以得到d1=3(因为这个值略小于3.45)。 - 同理,
(d-scnt)*100是略小于34.5的值,减去d1*10=30后得到略小于4.5的值,截断后d2=4。 - 到计算
d3的时候,(d-scnt)*1000是略小于345的值,而d1*100 + d2*10 = 340,两者相减得到的是略小于5的值(比如4.99999999991),赋值给int时截断小数,就得到了4。
那为什么直接用cout输出那个表达式会显示5呢?因为cout默认会对浮点数进行格式化四舍五入,它会把这个接近5的近似值(比如4.99999999991)显示成5,但赋值给int变量时是直接丢掉小数部分,所以两者结果不一样。
内容的提问来源于stack exchange,提问作者SABER
相关产品推荐
相关产品推荐

