我知道浮子固有的不精确性。我很困惑的是为什么我会从我希望解决的问题中获得“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),正是用明文写的 - 然而它们会产生两种不同的结果。
答案 0 :(得分:7)
问题是你的第二个表达式不等同于第一个表达式:它始终使用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);
(another demo)。