繁体   English   中英

PHP中条件的奇怪行为

[英]Strange behaviour of conditions in PHP

我想知道为什么下面的代码输出:

$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

感谢任何可以向我解释这一点的人。

仅引用PHP手册中的浮点数一章:

警告浮点精度

浮点数的精度有限。 尽管它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入为1.11e-16的顺序,它将提供最大的相对误差。 非基本算术运算可能会产生较大的错误,并且,当然,在合并多个运算时必须考虑错误传播。

此外,在底数10中可精确表示为浮点数的有理数(如0.1或0.7)在底数2中没有作为浮点数的精确表示,内部使用,而不考虑尾数的大小。 因此,如果不损失一点点精度,就不能将它们转换为内部二进制副本。 这可能导致混乱的结果:例如,floor((0.1 + 0.7)* 10)通常返回7而不是预期的8,因为内部表示形式类似于7.9999999999999991118 ....

因此,永远不要将浮点数结果信任到最后一位,并且不要直接比较浮点数是否相等。 如果需要更高的精度,则可以使用任意精度的数学函数和gmp函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM