2012-04-09 42 views
1

我有兩個相等的浮點型變量,我通過PHP檢索並減去它們。結果等於(7.105427357601E-15)我試圖將其更改爲double或decimal並且沒有任何效果。這是我在PHP中使用:從mySQL讀取一個浮點型

$giftcard_balance = $giftcard['balance']; 
$total = $product['price']; 

$total -= $giftcard_balance; 
echo $total; 

這裏不是顯示0,它顯示(7.105427357601E-15)

任何人都可以幫助嗎?

+0

那裏通常有什麼值? – BenOfTheNorth 2012-04-09 12:28:49

+4

花車不是序號。它們也不能完美地代表某些價值。您不能使用==來比較浮點數或依靠從相同的值中減去一個值,結果爲0. – GordonM 2012-04-09 12:28:55

+1

減去另一個值的相同值有什麼意義。結果是0.區別來自浮點不準確 – 2012-04-09 12:28:56

回答

1

爲了擺脫浮動不準確,你可以,例如,使用數字格式。

$a = 7.105427357601E-15; 
$b = number_format($a, 2); 
echo $a , "\n", $b , "\n"; 
+0

謝謝,我試了number_format並解決了問題 – 2012-04-14 15:41:11

0

也許您正在尋找php intvalfunction

或者可能是roundfunction

+1

intval將是一個錯誤intval(「0.5」)= 0 – 2012-04-11 13:45:28

3

在處理價格和賬戶餘額時,您會發現DECIMAL(6,2)比FLOAT更容易處理。如果您在使用DECIMAL數據類型時遇到同樣的問題,請發佈具體示例。

使用round()或類似的是一個非常糟糕的主意,因爲它只是掩蓋問題,而不是修復問題。

+0

有些情況下,您不能將FLOAT更改爲DECIMAL。在這種情況下,達到2,4,6等等可以成爲一個挽救生命的人,主要是如果它代表金錢的話。 – 2012-04-11 13:43:26

+1

@AtilaFulop - 這不是一個救命的人,它是一個等待醜陋的頭部後面的bug!掩蓋這樣的設計錯誤絕不是一個好主意。如果在原始設計中出現了錯誤,並且在修復它的過程中存在成本影響,則需要讓利益相關者瞭解未修復它的可能影響。這是一場幾乎總能贏得勝利的戰鬥。我曾多次出現過類似的情況。 – nnichols 2012-04-11 13:52:34

+0

如果你在Magento上有網上商店,你會如何解決它?將這些值存儲爲FLOAT。如果我將FLOAT更改爲DECIMAL,我打破了Magento。所以我想它只是從PHP解決它。有一個更好的解決方案比精確度足夠高的四捨五入嗎? – 2012-04-11 14:13:28