2011-08-27 131 views
3

可以幫我看看這個計算嗎?它假設回聲 「等於」 ...但它給我 「不等於」PHP簡單數學計算

<?php 
$tl_pax = 1; 
$ct_pax = 2; 
$at_pax = 2; 

$a = 0.5; 
$b = 0.2; 
$c = 0.2; 
$d = 0.2; 
$e = 0.2; 
$f = 0.2; 
$g = 0.2; 
$h = 0.9; 

$sum = $a + $b + $c + $d + ($e * $tl_pax) + ($f * $ct_pax) + ($g * $at_pax) + $h; 

$total = 3; 

if($total == $sum){ 
    echo 'equal: ' . $sum . ' - ' . $total; 
} 
else{ 
    echo 'not equal: ' . $sum . ' - ' . $total; 
} 
?> 
+0

什麼是輸出總和與總的範圍? –

+0

[Floating point miscuracy examples]可能的重複(http://stackoverflow.com/questions/2100490/floating-point-inaccuracy-examples) – Gordon

回答

5

這是與二進制浮點數相關的舍入誤差的常見情況。有些數字不能完全用二進制表示,因此結果會有一定的差距。要閱讀它,關於floating point numbers的維基百科文章是偉大的。

在這種情況下,發現了以往的模式是選擇一個三角形和比較反對:

if(abs($total - $sum) < 0.01) 
    echo "equal"; 

你必須appropiately挑你的三角洲根據用例。

+2

也許你應該使'if(abs($ total - $ sum)<0.01)' – Medo42

+0

忘記了abs。謝謝! – Femaref

1

區別是由於浮點精度的限制。

像0.9(9/10)這樣的值不能精確地寫成二進制浮點數,就像0.3333 ...(1/3)不能精確地寫成小數部分一樣。這意味着例如$ h擁有0.9的不精確的圓形表示。因此,您的計算結果產生的結果非常接近3,但不完全是3.

1

浮子是邪惡的。

報價從http://php.net/float

「所以永遠不要相信浮點數結果到了最後一位,也永遠不要比較兩個浮點數是否相等。如果需要更高的精度是必要的,任意精度數學函數和GMP功能可用。 「

2

這是因爲你的總和實際上是類似2.9999999999999999999,由於浮動蓬算術。當你打印時,PHP會隱藏你的信息。請參閱floor((0.1+0.7)*10)上的示例:http://php.net/manual/en/language.types.float.php

您不應該爲相等性比較浮點數。比較浮動的正確方法是使用範圍,如:

if($total-0.0000001 <= $sum && $sum <= $total+0.0000001){ 

你可以看到它在這裏的行動:http://codepad.org/kaVXM5g0

這條線只是意味着$總必須在$總和的0.0000001被視爲相等。您可以自己挑選數字,具體取決於您需要的精度。

或者你可以只輪$sum在這種情況下,但此時你基本上做同樣的事情只是從2.5 - 3.499...而不是2.9999999 - 3.0000001