2012-10-27 42 views
1

可能重複:
Compare floats in php錯誤PHP減去兩個浮點值時

我有以下的代碼:

$a = 1.49; 
$b = 1.50; 

echo $b - $a; // Outputs 0.01, which is ok 

if (($b - $a) != 0.01) { 
     echo "Not ok"; 
} else { 
     echo "Ok"; 
} 

的問題是,如果聲明回聲「不好」,雖然減法結果是0.01。

任何想法爲什麼?

+2

[什麼每臺計算機科學家應該知道關於浮點運算(http://docs.oracle .com/cd/E19957-01/806-3568/ncg_goldberg.html) – Rapptz

+2

@Rapptz雖然這通常是我會推遲的資源,但我不確定它適用於此。編輯:我錯了。 –

+0

@WaleedKhan無論如何,真正的浮點比較是非常棘手的。更不用說這個話題已經做了好幾遍了。 – Rapptz

回答

3

這是因爲一些浮點運算。結果不完全是0.01。系統會對您的輸出進行四捨五入。

只是嘗試var_dump(($b-$a)-0.01)。這應該是float(8.673617379884E-18)

一個解決辦法是if (round($b - $a,2) != 0.01)

4

的PHP doc on floating point numbers展示瞭如何比較他們

正如警告上面提到,對於 平等測試浮點值是有問題的,因爲他們在內部代表 的方式。但是,有些方法可以針對這些限制進行浮點比較。

要測試相等的浮點值,使用由於舍入而導致的相對誤差的上限。這個值被稱爲 機器的epsilon或單位舍入,並且是計算中最小的可接受的 。

<?php 
// $a and $b are equal to 5 digits of precision. 
$a = 1.23456789; 
$b = 1.23456780; 
$epsilon = 0.00001; 

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

適用於你的例子:

$c = $b - $a; 
$epsilon = 0.00001; 

if (abs($a-$b-0.01) < $epsilon) { 
     echo "Not ok"; 
} else { 
     echo "Ok"; 
} 

輸出OK

+0

我明白了,但比較必須雙向工作,所以更小或更大。 – Psyche