有人可以解释一下这段代码中的逻辑吗?
<?php
echo ((0.1 + 0.7) * 10) .'<br />'; // 8
echo (int) ((0.1 + 0.7) * 10) .'<br />'; // 7 why?
echo ((0.1 + 0.8) * 10) .'<br />'; // 9
echo (int) ((0.1 + 0.8) * 10) .'<br />'; // 9 why ??
?>
答案 0 :(得分:0)
来自手册:http://php.net/manual/en/language.types.float.php
警告 浮点精度
浮点数的精度有限。虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入的顺序为1.11e-16,因此会产生最大的相对误差。非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑误差传播。 另外,可以精确表示为基数10中的浮点数的有理数,如0.1或0.7,不具有精确表示为基数2中的浮点数,其在内部使用,无论尾数的大小。因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物。这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 .... 因此,永远不要将浮点数结果信任到最后一位,并且不要直接比较浮点数是否相等。如果需要更高的精度,可以使用任意精度数学函数和gmp函数。 有关“简单”的解释,请参阅标题为"Why don’t my numbers add up?"
的»浮点指南答案 1 :(得分:0)
如果我们将浮点数转换为整数,则输出将是小数点前的数字。表示如果我们将10.9
转换为整数,则输出将为10
您还应该引用这些功能ceil(),floor()和round()。
有关详细信息,请参阅以下链接,
PHP unexpected result of float to int type cast
希望它会对你有所帮助: - )