ホームページ  >  記事  >  バックエンド開発  >  PHP 浮動小数点 10 進比較: なぜ等しくないのでしょうか?

PHP 浮動小数点 10 進比較: なぜ等しくないのでしょうか?

WBOY
WBOYオリジナル
2024-03-08 16:24:041164ブラウズ

PHP 浮動小数点 10 進比較: なぜ等しくないのでしょうか?

PHP 浮動小数点 10 進数の比較: なぜ等しくないのでしょうか?

プログラミングでは、2 つの浮動小数点数が等しいかどうかを比較する必要がある状況によく遭遇します。ただし、PHP を使用して浮動小数点数を比較すると、精度の問題により、一見等しい 2 つの浮動小数点数が等しくないことがよくわかります。この状況はしばしば混乱を招くため、この記事では PHP における浮動小数点数の比較の問題を詳しく掘り下げ、浮動小数点数を比較するときに不等な状況が発生する理由を示す具体的なコード例を示します。

コンピュータでは、浮動小数点数は 2 進数で表現されます。2 進数では特定の 10 進数 (0.1 など) を正確に表現できないため、コンピュータの浮動小数点数は近似値となることがよくあります。これにより、浮動小数点数を比較するときに精度の問題が発生し、0.1 0.2 != 0.3 などの状況が頻繁に発生します。

具体的な例を通してこの問題を説明しましょう。 2 つの浮動小数点数 0.1 と 0.2 があり、PHP を使用してそれらの合計が 0.3 に等しいかどうかを比較しようとするとします。

$num1 = 0.1;
$num2 = 0.2;

$sum = $num1 + $num2;
$expected = 0.3;

if ($sum == $expected) {
    echo "相等";
} else {
    echo "不相等";
}

上記のコードを実行すると、出力結果は次のようになります。 「等しくない」とは、0.1、0.2、0.3 がコンピュータ内の正確な値ではなく、近似値であるため、比較するときに精度誤差が生じるためです。

この問題を解決するには、PHP の組み込み関数 round() を使用して浮動小数点数を丸め、精度エラーを回避します。上記のコードを次のように変更します。

$num1 = 0.1;
$num2 = 0.2;

$sum = $num1 + $num2;
$expected = 0.3;

if (round($sum, 10) == round($expected, 10)) {
    echo "相等";
} else {
    echo "不相等";
}

round() 関数を使用することで、浮動小数点数の小数点以下の桁数を保持し、計算結果をより正確にします。 。このコード例では、round($sum, 10)round($expected, 10) を使用して、2 つの浮動小数点数の合計を期待値の精度と比較します。したがって、精度誤差によって引き起こされる不平等を回避できます。

要約すると、PHP における浮動小数点数の不等比較の問題は、主に浮動小数点数の近似誤差と精度誤差によって引き起こされます。浮動小数点数を比較するときは、精度の問題に注意し、浮動小数点数の比較に等号を直接使用しないようにする必要があります。精度を適切な方法で処理することで、浮動小数点比較の精度を確保でき、プログラムの安定性と信頼性が向上します。

この記事の紹介を通じて、読者が PHP の浮動小数点数比較問題をより深く理解し、実際の開発における精度エラーによるバグを回避できることを願っています。

以上がPHP 浮動小数点 10 進比較: なぜ等しくないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。