在PHP中舍入

ale*_*kin 3 php floating-point floating-accuracy

$a = ((0.1 + 0.7) * 10) == (int)((0.1 + 0.7) * 10);
Run Code Online (Sandbox Code Playgroud)

PHP返回false.

任何人都可以解释一下,为什么会这样?首先返回8,第二个7.

Gor*_*don 14

引用PHP浮点精度手册中大红色警告:

通常,简单的小数部分像0.10.7不能转换成它们的内部二进制对应物,而不会有很小的精度损失.这可能导致令人困惑的结果:例如,floor((0.1+0.7)*10)通常会返回7而不是预期8,因为内部表示将是类似的7.9.

这是因为不可能用有限数字的十进制表示法表示一些分数.例如,1/3以十进制形式变为0.3.

因此,永远不要将浮点数结果信任到最后一位,并且永远不要将浮点数与相等性进行比较.如果需要更高的精度,可以使用任意精度数学函数gmp函数.


Mar*_*ers 5

浮点运算不精确.而不是8.0,你可以获得7.999 ...当被转换为整数时被截断为7.

echo number_format((0.1 + 0.7) * 10, 20);
Run Code Online (Sandbox Code Playgroud)

结果:

7.99999999999999911182
Run Code Online (Sandbox Code Playgroud)

  • `var_dump((0.1 + 0.7)*10);`为输出舍入到'float(8)`没有用. (2认同)