我想知道为什么输出以下代码:
$a = log(5, 5);
$b = round(log(5, 5));
echo 'a: ';
var_dump($a);
echo '<br>';
echo 'b: ';
var_dump($b);
echo '<br>';
echo ($a == $b) ? 'equal' : 'not equal';
此
a: float(1)
b: float(1)
not equal
感谢任何能向我解释此事的人。
答案 0 :(得分:7)
引用PHP手册中的Floating point numbers章节:
警告浮点精度
浮点数的精度有限。虽然这取决于 在系统中,PHP通常使用IEEE 754双精度格式, 由于订单的舍入,这将产生最大的相对误差 1.11e-16。非基本算术运算可能会更大 错误,当然,必须考虑错误传播 几个操作复杂化。
此外,有理数的数字可以完全表示为 基数10中的浮点数,如0.1或0.7,没有 精确表示为基数2中的浮点数,即 内部使用,无论尾数的大小。因此,他们 没有a就无法转换成它们的内部二进制对应物 精度损失小。这可能导致令人困惑的结果:for 例如,floor((0.1 + 0.7)* 10)通常会返回7而不是 预期8,因为内部表示将是类似的 7.9999999999999991118 ....
所以永远不要将浮点数结果信任到最后一位数,不要 直接比较浮点数是否相等。如果更高 精度是必要的,任意精度数学函数和gmp 功能可用。