2014-11-24 102 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);