2

重複の可能性:
phpでfloatを比較する

私は次のコードを持っています:

$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であるにもかかわらず、ifステートメントが「Notok」とエコーすることです。

なぜですか?

4

2 に答える 2

4

浮動小数点数に関するPHPドキュメントは、それらを比較する方法を示しています

上記の警告で述べたように、浮動小数点値が内部的に表される方法が原因で、浮動小数点値が等しいかどうかをテストすることには問題があります。ただし、これらの制限を回避する浮動小数点値を比較する方法があります。

浮動小数点値が等しいかどうかをテストするには、丸めによる相対誤差の上限を使用します。この値は、マシンイプシロンまたはユニットラウンドオフと呼ばれ、計算で許容される最小の差です。

<?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

于 2012-10-27T20:24:31.237 に答える
3

これは、いくつかの浮動小数点演算が原因です。結果は正確に0.01ではありません。出力はシステムによって丸められます。

試してみてくださいvar_dump(($b-$a)-0.01)。これはfloat(8.673617379884E-18)

解決策はif (round($b - $a,2) != 0.01)

于 2012-10-27T20:24:09.207 に答える