PHP浮動小数点型と整数型を比較した小さな穴
1488 ワード
今日はPHPで面白いことを見てみましょう.浮動小数点数(floats)です.
上のコードはどんな結果になると思いますか?1. true 2. false 3. この比較は状況によって決まる
実は簡単です.ここでは
もしそうなら?
左120085、右120085と思うかもしれませんが、結果はtrueです.
もしあなたがそう思うなら、あなたは間違っています.実はあなたは上のコードを実行して、結果はfalseです.
しかし、私はしかし!もう一度数字を修正して、コードを実行してみてください.例えば、次のようにします.
結果は非常に不思議で、この時の結果はtrueなので、この比較は実際には
では、問題はどこにあるのでしょうか.次のコードを実行してみます.
結果は次のようになります.
float(120085) int(120085)
核心的な違いは見えないようですが、もう一度やってみましょう.
この時の結果はこうだったはずです.
float(1.4551915228367E-11)
これは問題を説明していますが、実はこの結果は
では、このようにして、私たちはどのように比較して私たちが望んでいる値ですか?
答えは
だから、PHPを使ってこれらの精度を計算して比較する時、必ずその比較結果を実測して、あるいはいくつかの保険の手段を使って比較して、さもなくば大きな損をします!公衆番号codecastsに注目し、PHP Laravelスキルを毎日更新
上のコードはどんな結果になると思いますか?1. true 2. false 3. この比較は状況によって決まる
実は簡単です.ここでは
===
を使って比較したので、この結果がはっきりしているのはfalseです.左はfloatsのような数で、右はintタイプの数です.これは特に議論することはありません.もしそうなら?
==
を使って比較したときですか?左120085、右120085と思うかもしれませんが、結果はtrueです.
もしあなたがそう思うなら、あなたは間違っています.実はあなたは上のコードを実行して、結果はfalseです.
しかし、私はしかし!もう一度数字を修正して、コードを実行してみてください.例えば、次のようにします.
結果は非常に不思議で、この時の結果はtrueなので、この比較は実際には
です.では、問題はどこにあるのでしょうか.次のコードを実行してみます.
結果は次のようになります.
float(120085) int(120085)
核心的な違いは見えないようですが、もう一度やってみましょう.
die(var_dump(120085 - 1200.85 * 100));
この時の結果はこうだったはずです.
float(1.4551915228367E-11)
これは問題を説明していますが、実はこの結果は
0
ではなく、小さなfloatsのような数です.PHPドキュメントを見たとき:http://php.net/manual/zh/lang...その大きなWarningに注意すれば、ここの核心的な問題は浮動小数点数の精度であることがわかるはずです.では、このようにして、私たちはどのように比較して私たちが望んでいる値ですか?
答えは
round()
関数を使用しています.die(var_dump(round(1200.85 * 100) == 120085));
だから、PHPを使ってこれらの精度を計算して比較する時、必ずその比較結果を実測して、あるいはいくつかの保険の手段を使って比較して、さもなくば大きな損をします!公衆番号codecastsに注目し、PHP Laravelスキルを毎日更新