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

Gre*_*gle -3 c++ floating-point

我知道浮子固有的不精确.我感到困惑的是为什么我会从我期望解决的问题返回"100"0.99999999等.0.33*3怎么可能产生100?

这是我的代码:如果我说

float x = 100.0/3.0;
printf("%f",x*3.0);
Run Code Online (Sandbox Code Playgroud)

输出为"99.999996".但如果我说

printf("%f",(100.0/3)*3);
Run Code Online (Sandbox Code Playgroud)

输出为"100".它们不应该相同吗?我希望x解决(100.0/3.0),正是用明文写的 - 然而它们会产生两种不同的结果.

das*_*ght 7

问题是你的第二个表达式不等于第一个表达式:它doubles在整个过程中使用,而第一个表达式float在除法之后进行转换,迫使中间结果降低精度.

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

printf("%f", ((float)(100.0/3.0))*3.0);
//             ^^^^^
Run Code Online (Sandbox Code Playgroud)

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

如果你在第一个例子中使用doublefor x,你也得到了输出100.000000:

double x = 100.0/3.0;
printf("%f",x*3.0);
Run Code Online (Sandbox Code Playgroud)

(另一个演示).