(100.0 / 3.0)* 3 == 100,但使用变量产生99.99996。这是怎么回事?

时间:2014-05-04 09:30:12

标签: c++ floating-point

我知道浮子固有的不精确性。我很困惑的是为什么我会从我希望解决的问题中获得“100”返回0.99999999等。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),正是用明文写的 - 然而它们会产生两种不同的结果。

1 个答案:

答案 0 :(得分:7)

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

要构建完全等效的表达式,请在分割后向float添加强制转换,如下所示:

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

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

如果您在第一个示例中使用double x,那么您也会获得输出100.000000

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

another demo)。