0

为什么这个代码返回false,你能解释一下为什么会这样吗?

var_dump( 85.4 + 42.7 == 128.1  );  // bool(false)
4

2 回答 2

5

再次,浮点精度。在处理浮点数时,您不能依赖精确的比较。相反,您应该使用精度增量:

$a = 85.4+42.7;
$b = 128.1;
$delta = 1E-13;

if(abs($a-$b)<$delta)
{
   //they are equal
}

-这里$delta是精度增量。对于 PHP,1E-13就足够了。手册说:

浮点数的精度有限。尽管取决于系统,但 PHP 通常使用 IEEE 754 双精度格式,由于在 1.11e-16 的数量级四舍五入,这将给出最大的相对误差。非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。

此外,可以精确表示为以 10 为底的浮点数的有理数,如 0.1 或 0.7,没有精确表示为以 2 为底的浮点数,无论尾数大小如何,它都在内部使用。因此,它们不能被转换成它们内部的二进制对应物,而不会有小的精度损失。这可能会导致令人困惑的结果:例如, floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示将类似于 7.9999999999999991118...。

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

对于“简单”的解释,请参阅同样标题为“为什么我的数字不加起来?”的浮点指南。

于 2013-10-17T09:39:07.363 回答
1

这是因为浮点数不完美的精度,在这里阅读更多:http: //php.net/manual/en/language.types.float.php

于 2013-10-17T09:39:43.937 回答