2014-11-24 53 views
0

在我的申请中,我有一个与财务余额修改相关的过程,所以它被包装在一个事务中。在PHP中比较两个数字

而在操作结束之前,在提交事务之前,我有一个小检查 - 确保平衡已被正确修改。

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$amountfloat

有人可以解释这种奇怪的行为,为什么会发生?有一些错误吗?

+2

[PHP数学精密]的可能重复(http://stackoverflow.com/questions/3726721/php-math-precision) – AbraCadaver 2014-11-24 20:15:23

+0

'floats'再次袭来。 – 2014-11-24 20:16:23

回答

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);