ホームページ  >  記事  >  バックエンド開発  >  PHPの浮動小数点数比較方法

PHPの浮動小数点数比較方法

尚
転載
2020-03-25 09:20:514011ブラウズ

PHPの浮動小数点数比較方法

PHP マニュアルには、「2 つの浮動小数点数が等しいかどうかを決して比較しないでください」という言葉があります。

コンピューターが浮動小数点数を処理する方法では、浮動小数点数が 100% 正確であることは不可能であると内部的に判断されるため、浮動小数点数を処理するときに精度の低下が発生します。たとえば、次のプログラム:

<?php  
$a   =   15521.42;  
$b   =   15480.3;  
$c = $a-$b;  
var_dump($c);    //php4:float(41.120000000001)   php5:float(41.12)   
var_dump($c == 41.12);     //bool(false)   
?>

最初の出力ステートメント: PHP4 での出力 $c は 41.120000000001 または同様の結果になる可能性があり、次の 1 は精度損失の一部です。 PHP5 ではこの問題に対していくつかの「最適化」が行われ、出力結果に不正確な部分が表示されないようになっていますが、同時にこの問題は無視して $c==41.12 と考えます。

2 番目の出力ステートメント: false は、PHP4 および PHP5 で出力されます。

免責事項: これは PHP の問題ではなく、コンピュータの内部浮動小数点数処理の問題です。 C/JAVA でも同じ問題が発生します。

拡張: >、f539a70d3ea090bac4faa80192f58ccc=、<=

では、2 つの浮動小数点数が等しいかどうかをどのように比較すればよいでしょうか。

上記の序文を読んだ後、2 つの浮動小数点数が等しいかどうかを正確に比較する方法がないことが分かりました。したがって...必要な精度範囲内でのみ比較できます (たとえば、上記の例では、$c が小数点以下 2 桁以内で 41.12 に等しいかどうかを比較するだけで済みます)。

以下は PHP マニュアル コメントの例です

nction floatcmp($f1,$f2,$precision = 10) {// are 2 floats equal   
    $e = pow(10,$precision);  
    $i1 = intval($f1 * $e);  
    $i2 = intval($f2 * $e);  
    return ($i1 == $i2);  
}  
function floatgtr($big,$small,$precision = 10) {// is one float bigger than another   
    $e = pow(10,$precision);  
    $ibig = intval($big * $e);  
    $ismall = intval($small * $e);  
    return ($ibig > $ismall);  
}  
function floatgtre($big,$small,$precision = 10) {// is on float bigger or equal to another   
    $e = pow(10,$precision);  
    $ibig = intval($big * $e);  
    $ismall = intval($small * $e);  
    return ($ibig >= $ismall);  
}



関連する推奨事項:

PHP ビデオ チュートリアル:https://www.php.cn/course/list/29/type/2.html

以上がPHPの浮動小数点数比較方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はoschina.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。