我在书中找到了某个地方
echo (int) ((0.1 + 0.7) * 10);
输出为:7
echo ((0.1 + 0.7) * 10);
输出:8
为什么两者都不同?我认为答案应该是8
答案 0 :(得分:6)
写作时
echo ((0.1 + 0.7) * 10);
这个简单算术的结果 表达式在内部存储为7.999999而不是8.
现在当值转换为int时,
echo (int) ((0.1 + 0.7) * 10); // 7.999999 when typecasted to int becomes 7
PHP只是截断小数部分,导致相反 重大错误(确切地说是12.5%)。
答案 1 :(得分:2)
这是因为在这种情况下浮点数不适合内存,并在转换为整数时被截断。
中了解相关内容警告
浮点精度
浮点数的精度有限。虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入的顺序为1.11e-16,因此会产生最大的相对误差。非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑误差传播。
此外,可以在基数10中精确表示为浮点数字的有理数,如0.1或0.7,没有精确表示为基数2中的浮点数,这在内部使用,无论尾数的大小。因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物。这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....
所以永远不要将浮点数结果信任到最后一位数,而不要直接比较浮点数是否相等。如果需要更高的精度,可以使用任意精度数学函数和gmp函数。
答案 2 :(得分:0)
请检查http://php.net/manual/en/language.types.integer.php并找到此
Warning : Never cast an unknown fraction to integer, as this can sometimes lead to unexpected results.
<?php
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
?>
See also the warning about float precision.