2013-10-10 86 views
3

我正在爲一個客戶端的項目工作,其相當簡單。但有一個計算,我必須做的也很簡單,就像這個例子:與PHP的奇怪減法結果

$a = (49.95 - 24.95); 
if ($a == 25.00) { 
    echo "TRUE"; 
} 

這等於25.00吧!但沒有它返回假?

但如果我這樣做,類似於計算另一個例子,我需要:

$a = (99.95 - 24.95); 
if ($a == 75.00) { 
    echo "TRUE"; 
} 

然後我得到真正的!我會生氣,還是這是一個bug?

+3

你可以**從來沒有**,*** *** ***比較浮點值的平等。 Google或等待某人發佈相關鏈接。 :-) – Jon

+0

這是數學... http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Leri

+1

必備xkcd卡通:http://www.xkcd.com/217/ – Reeno

回答

2

就像你可以閱讀手冊,不要直接比較float。請使用epsilon

<?php 
$a = 1.23456789; 
$b = 1.23456780; 
$epsilon = 0.00001; 

if(abs($a-$b) < $epsilon) { 
    echo "true"; 
} 

這是因爲PHP內存如何浮動的方式。你可以閱讀手冊,例如。這裏http://pl1.php.net/float

+0

謝謝,下次不會忘記:) – user2863313

2

這不是一個錯誤。這是關於float number precision。由於浮點數以小數精度存儲,因此不能依賴精確比較操作,如==(相等比較)。

相反,你shoult使用精密三角洲和比較花車,如:

$a = (49.95 - 24.95); 
$b = 25; 
$delta = 1E-13; 

if(abs($a-$b)<$delta) 
{ 
    echo('TRUE'); 
} 

在PHP中,1E-13將使用精密增量是不夠的。有關浮點數及其表示形式,請參見this指南。

+0

謝謝你,這完美的工作,我只是無法讓我頭大概爲什麼第一個例子不工作,第二個是。 – user2863313

1
$a = (49.95 - 24.95); 
if ((int)$a == 25) { 
    echo "TRUE"; 
} 
0

在第一個例子中,有一個浮點數與一個整數相比較,第二個例子中浮點數與浮點數相比較。由於浮點精度而導致的差異並不是一個錯誤。

爲了解決這個可以定義d (delta)數目,這將是計算的精度

然後就可以檢查是否的x-y絕對結果將是較低的,那麼您所限定的精度。像這樣的東西if(abs(x-y) < d)