在c中四舍五入有困难



当我试图找出如何将像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

相关内容

  • 没有找到相关文章

最新更新