(100.0/3.0)*3 == 100,但使用变量得到 99.99996。怎么回事?

(100.0/3.0)*3 == 100, but using variables yields 99.99996. What's the deal?

本文关键字:99996 怎么回事 变量      更新时间:2023-10-16

我知道浮点数固有的不精确性。我感到困惑的是,为什么我会从我期望解析0.99999999等的东西中返回"100"。0.33*3怎么可能产生100?

下面是我的代码:如果我输入
float x = 100.0/3.0;
printf("%f",x*3.0);

输出为"99.999996"。但是如果我输入

printf("%f",(100.0/3)*3);

输出为"100"。它们不应该是相同的吗?我希望x能够解析为(100.0/3.0),也就是明文形式写的内容——但是它们会产生两个不同的结果。

问题是您的第二个表达式不等于第一个表达式:它始终使用doubles,而第一个表达式在除法后转换为float,迫使中间结果降低精度。

要构建一个完全等价的表达式,在除法后对float进行强制转换,如下所示:

printf("%f", ((float)(100.0/3.0))*3.0);
//             ^^^^^

这会产生与第一个示例相同的输出,即"99.999996 (demo)

如果在第一个示例中使用double代替x,那么也会得到输出100.000000:

double x = 100.0/3.0;
printf("%f",x*3.0);

(另一个演示)。