ホームページ > バックエンド開発 > PHPチュートリアル > PHPの浮動小数点数比較方法

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

リリース: 2023-04-08 13:38:02
転載
4016 人が閲覧しました

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 でも同じ問題が発生します。

拡張: >、<、>=、<=

では、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 サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:oschina.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート