You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:33:08