PHP中条件的奇怪行为

时间:2012-11-27 13:18:26

标签: 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';

a: float(1) 
b: float(1) 
not equal

感谢任何能向我解释此事的人。

1 个答案:

答案 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   功能可用。