2011-03-22 11 views
2

以下のテストケースを参照してください:?あなたが最後のif/elseブロックはまた、右、真示すだろうと思うだろうfloatval()から得られたこの値は、別の数値と比較したときにfalseに評価されるのはなぜですか?

$val = floatval("336.00"); 
$result = 300*1.12; 

header("content-type: text/plain"); 

echo "\$result = 300*1.12 which equals $result\n"; 
echo "\$val = floatval(\"336.00\") which equals $val\n"; 
echo "gettype(\$val) = ".gettype($val)."\n"; 
echo "gettype(\$result) = ".gettype($result)."\n"; 
echo "gettype(300*1.12) = ".gettype(300*1.12)."\n"; 
echo "gettype(floatval(\$result)) = ".gettype(floatval($result))."\n"; 

if ($result == 300*1.12) 
    echo "\$result == 300*1.12 is true\n"; 
else 
    echo "\$result == 300*1.12 is false\n"; 

if ($result == $val) 
    echo "(\$result == \$val) \$result == 300*1.12 is true\n"; 
else 
    echo "(\$result == \$val) \$result == 300*1.12 is false\n"; 

をそうではありません!同じスクリプトの出力を参照してください:

$result = 300*1.12 which equals 336 
$val = floatval("336.00") which equals 336 
gettype($val) = double 
gettype($result) = double 
gettype(300*1.12) = double 
gettype(floatval($result)) = double 
$result == 300*1.12 is true 
($result == $val) $result == 300*1.12 is false 

私はここで何が欠けていますか? PHP 5のさまざまなバージョンで試してみましたが、すべて同じ出力を生成します。

+2

浮動小数点比較の問題。 – BoltClock

+0

[phpの浮動小数点数を比較]の可能な複製(http://stackoverflow.com/questions/3148937/compare-floats-in-php) – Jon

+0

http://stackoverflow.com/search?q=floating+point+inaccuracy+ [ php] – paxdiablo

答えて

1

浮動小数点演算については、各操作で小さな誤差が生じることがあります。それはあなたが、エラーが特定の精度のために十分に小さい場合は、しかし、確認することができ平等

$a == $b; 

ための2つの浮動小数点値を比較することはできません意味:

abs($a - $b) < $eps; 

$epsは、使用しているシステムに依存しています、 Wikiで詳細を読むことができます。もちろん、これは1回の算術演算にのみ適用されます。いくつかの操作を実行した後、イプシロンを適切にスケーリングする必要があります。

関連する問題