PHP浮动减法错误

时间:2014-05-01 17:48:48

标签: php math floating-point-precision

我在需要减法结果小于或等于零的情况下收到错误。具体值是(通过var_dump获得):

$arr_charges[total] = float(25.63)
$arr_credits[total] = float(25.63)
($arr_charges[total] - $arr_credits[total]) = float(3.5527136788005E-15)

我希望($arr_charges[total] - $arr_credits[total]) = float(0),因为两个值都是相同的数字。我理解这个问题可能会出现不同的数字,由于浮点数的精度问题,但我认为当使用相同的数字作为minuend和subtrahend时这很奇怪。

我正在使用PHP:

> php --version
PHP 5.4.6-1ubuntu1.8 (cli) (built: Apr  4 2014 01:28:36)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with XCache v2.0.0, Copyright (c) 2005-2012, by mOo

这是正常的吗?或者这是一个PHP错误?

似乎有办法修复结果,那就是将强制转换应用于int。在我看来它有效,但在某些情况下可能还不够。

更新05/01/2014 - 1

感谢您的回答。这是一段相关的代码:

$arr_charges['total'] = 25.63;
$arr_credits['total'] = 25.63;

return (($arr_charges['total'] - $arr_credits['total']) <= 0 );

此代码返回false,因为减法操作返回3.5527136788005E-15,如上面var_dump结果中所述。

是的,我知道浮点精度存在问题,但我不希望在上面暴露的情况下发生这个问题。即使这样,我也会问,因为我想知道是否有一种方法可以使用这种浮点值的操作。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以通过近似来测试相等性,以避免浮点错误

function isEqual($a, $b)
{
    return abs($a-$b) <= 0.00001;
}