2010-11-25 25 views
2

PHPの浮動小数点は何が問題なのですか?フロートの問題! (PHPで)

$v = 5.2 * 3; 

if($v==15.6) { 
    echo 'Everything is fine =)'; 
} else { 
    echo 'Okay something is wrong :S'; 
    var_dump($v); // float 15.6 
} 

すぎて、これをチェックアウト:

$v = 5.2 * 3; 

if($v>15.6 AND $v<15.60000000001) { 
    echo 'We are doomed :S'; 
    var_dump($v); // float 15.6 
} else { 
    echo 'Everything is fine =)'; 
} 

を私はそれが内部表現またはいくつかのあいまいな低レベルのものとは何かを持っていると思いますか?それが事実なら、どうすればこの問題を回避できますか? リアルマネー取引を計算する前に知っておくべきことは何ですか?

+0

[Real vs. Floating Point vs. Money]の複製可能性(http://stackoverflow.com/questions/273371/real-vs-floating-point-vs-money) – Piskvor

+2

*(参考)* http: /de.php。net/manual/en/function.bccomp.php – Gordon

+1

これは参考になるはずです。http://docs.sun.com/source/806-3568/ncg_goldberg.html – Piskvor

答えて

7

のように私はこれが重複していると確信していますので、私はこのCW作ってるんだ山車を比較する必要がある場合

$v = 5.2 * 3; 
if (bccomp($v, 15.6) === 0) { 
    echo 'Everything is fine =)'; 
} else { 
    echo 'Okay something is wrong :S'; 
    var_dump($v); // float 15.6 
} 

')=すべては大丈夫です' 与える

3

これは確かに内部表現と関係がある:)。浮動小数点値を比較しないでください。私はこの問題を回避するPHPクラス/モジュールが存在すると思いますが、あなたのお金の値を整数として保存し、100でそれらを掛けることもできます。表示する前に再び分割することができます:)

+0

こちらもご覧ください:http://php.net/manual /en/language.types.float.php – KingCrunch

2

これは一般的に浮動小数点数と関係があり、PHPに限定されません。

あなたがあなたの最後の例でやったように、特定の精度での間隔を確認する必要が山車を使用して:正確な値を使用するときは、多くの問題に実行することができます

if(abs($v - 15.6) < 0.0001) 
{ 
    // Yey :) 
} 

1

あなたは本当に、代わりに完全一致の許可偏差の範囲内にあるかどうかを確認

$DEVIATION = 0.0001; 
if(abs($v-15.6)<$DEVIATION) ... 
1
$v = 5.2 * 3; 

if((string)$v == "15.6") { 
    print "yes"; 
} 

それのようにPHPのウェブサイトをチェックすることは常に良いことですほとんどの開発者は、浮動小数点を比較するための関数を示すPHP.net Floating Point Numberの前に問題を遭遇しました。

<?php 
    function IsFloatEqual($x,$y,$precision=0.0000001) 
    { 
     return ($x+$precision >= $y) && ($x-$precision <= $y); 
    } 
?> 
1

だけanywoneのマイナー追加が探して:

BC *関数は、PHPでの山車で動作するように唯一真の方法です!