Žan*_*rle 1 php if-statement behavior
我想知道为什么输出以下代码:
$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';
Run Code Online (Sandbox Code Playgroud)
这个
a: float(1)
b: float(1)
not equal
Run Code Online (Sandbox Code Playgroud)
感谢任何能够向我解释的人.
只是引用PHP手册中的浮点数一章:
警告浮点精度
浮点数的精度有限.虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入的顺序为1.11e-16,因此会产生最大的相对误差.非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑误差传播.
另外,可以精确表示为基数10中的浮点数的有理数,如0.1或0.7,不具有精确表示为基数2中的浮点数,其在内部使用,无论尾数的大小.因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物.这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)*10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....
因此,永远不要将浮点数结果信任到最后一位,并且不要直接比较浮点数是否相等.如果需要更高的精度,可以使用任意精度数学函数和gmp函数.