当我试图找出如何将像1.255
这样的浮点值四舍五入到最接近的百分之一时,我发现了一些有趣的东西。我在Debian 6上使用gcc 4.4.5。
int x = (1.255 * 100) + 0.5; // gives me back 125 instead of 126.
float y = (1.255 * 100) + 0.5; // gives me back 126.000000.
为什么当我保存到int
时,我会返回125
而不是126
?在fedora中,当我将上面的表达式保存到int
时,我会返回126
。这是debian中的gcc错误吗?如有任何帮助,我们将不胜感激。谢谢
虽然这看起来像是一个"典型"的浮点问题,但它比这更复杂。
这涉及三件事的组合:
- "常用"浮点表示法
- 隐式强制转换
- 隐性促销
让我们来分解一下:
默认情况下,浮点文字的类型为double
。因此CCD_ 8属于CCD_。
因此表达式:
(1.255 * 100) + 0.5
使用类型CCD_ 10来完成。
但由于二进制浮点不能准确地表示1.255
,因此表达式的计算结果为:
(1.255 * 100) + 0.5 = 125.99999999999999000000
并且是类型CCD_ 12。
由于这小于126
,将其存储为整数将产生125
。将其存储到float
将把它四舍五入到最接近的float
,从而得到126
。
int x = (1.255 * 100.) + 0.5;
float y = (1.255 * 100.) + 0.5;
double z = (1.255 * 100.) + 0.5;
cout << fixed;
cout << x << endl;
cout << setprecision(20) << y << endl;
cout << setprecision(20) << z << endl;
输出:
125
126.00000000000000000000
125.99999999999999000000