2011-11-15 81 views
1

這裏總結:php浮點數學運算錯誤?

$a = 213480.7-190.46; 
exit($a-213290.24); 
# 2.9103830456734E-11 

結果輸出假設是0,但輸出

操作結果的故事:

$b is : 213480.7 
-190.46 
$b is : 213290.24 

天平現在看起來是正確的。但在使用時比較操作..結果是怪異 這裏是後續代碼var_dump和比較結果

var_dump($b); 
# float 213290.24 

if ($b==213290.24) { 
    exit('same'); 
} elseif ($b>213290.24) { 
    exit('larger '.($b-213290.24)); 
} else { 
    exit('smaller '.($b-213290.24)); 
} 
#larger 2.9103830456734E-11 

誰能告訴我該怎麼解決呢?

+0

vote down?我不明白?是我的問題? –

+0

我沒有downvote,但你已經用答案標記了你的問題:floating-accuracy。 – deceze

+0

感謝您爲我確定問題。沒有解決方案? –

回答

2

在這裏看到:http://php.net/manual/en/language.types.float.php

所以永遠不要相信浮點數結果精確到了最後一位,決不 比較兩個浮點數是否相等。如果需要更高精度 ,則可以使用任意精度數學函數和gmp函數 。

處理浮點比較的常用方法是添加一個可允許的epsilon或浮點值的小差異,因此小公差內的任何內容都被認爲是等價的。

if (abs(213290.24 - $b) < .001) { 
    exit('same') 
} 
2

對浮點數字值執行的計算始終由其機器表示形式產生inherent error。出於這個原因,您不應該使用等號運算符==來比較浮點值。

典型的方法是確定最小允許誤差,並檢查要比較的值之間的差異是否小於所需的誤差。

$min_error = 0.00001; 
if (abs($a - $b) < $min_error) 
{ 
    exit("same"); 
} 
0

這不是php的問題,它與二進制浮點的性質有關。 你不能用float來精確地表示所有的有理數。例如,您可能會嘗試比較0.1 + 0.2 == 0.3,這將是失敗,因爲0.3不能準確表示。