我有以下的代碼:
$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。
任何想法爲什麼?
我有以下的代碼:
$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。
任何想法爲什麼?
這是因爲一些浮點運算。結果不完全是0.01。系統會對您的輸出進行四捨五入。
只是嘗試var_dump(($b-$a)-0.01)
。這應該是float(8.673617379884E-18)
一個解決辦法是if (round($b - $a,2) != 0.01)
的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
我明白了,但比較必須雙向工作,所以更小或更大。 – Psyche
[什麼每臺計算機科學家應該知道關於浮點運算(http://docs.oracle .com/cd/E19957-01/806-3568/ncg_goldberg.html) – Rapptz
@Rapptz雖然這通常是我會推遲的資源,但我不確定它適用於此。編輯:我錯了。 –
@WaleedKhan無論如何,真正的浮點比較是非常棘手的。更不用說這個話題已經做了好幾遍了。 – Rapptz