比较PHP中的两个数字

时间:2014-11-24 20:12:48

标签: php math floating-point equality

在我的申请中,我有一个与财务余额修改相关的程序,因此,它包含在一个交易中。

操作结束,就在提交交易之前,我进行了一次小检查 - 确保平衡得到了正确修改。

   public function setBalance($amount) {
       // ......
       // Updating balance code, nothing worst attention
       // ......

       $balance = $this->getBalance(false);

       if ($amount != $balance) {
           throw new Exception('Error updating balance! ' . $balance . " instead of " . $amount);
       }

这个简单的代码抛出异常。它说386.57不等于386.57。真。

我尝试使用我最喜欢的var_dumpdie检查区别。

    var_dump($balance - $amount);
    die();

输出更加精彩:

    float(-2.8421709430404E-13)

$balance$amount这两个数字都是float

有人可以解释这种奇怪的行为吗?为什么会这样?有错吗?

1 个答案:

答案 0 :(得分:2)

使用浮动时这是正常的。尝试使用此代码:

if (abs($amount-$balance) > 0.001) {
   throw new Exception('Error updating balance! ' . $balance . " instead of " . $amount);
}

如果你被这个抓住了,请记得正确地绕圈。这并不容易。什么时候圆,以及如何圆,是由很多人做的不同。请注意,PHP round()函数现在允许您选择舍入类型。像这样:

round($Value,2,PHP_ROUND_HALF_EVEN);