PHP は人気のあるプログラミング言語であり、サーバーサイド スクリプト言語です。 PHP は柔軟かつ強力な機能を備えているため、Web 開発の分野で広く使用されています。
PHP プログラミングでは浮動小数点数の計算がよく行われますが、浮動小数点数の小数点以下の数値は正確に表現することが難しいため、2 つの浮動小数点数が正しいかどうかを比較する際に問題となります。多くの場合、間違った結果が得られます。
PHP における不等な浮動小数点数の問題について説明しましょう。
浮動小数点数は、小数を表すために使用される数値であり、仮数と指数の 2 つの要素で構成されます。 IEEE 754 標準では、浮動小数点数は 2 進数で表現されます。
浮動小数点数の精度は値のサイズの変化に応じて変化するため、比較演算を実行するときは浮動小数点数の特性に注意する必要があります。
例:
$a = 0.1 + 0.2; $b = 0.3; echo ($a == $b) ? "Equal" : "Not Equal";
出力結果は等しいと予想されます。ただし、実際の出力結果は「等しくない」となります。
なぜそうなるのでしょうか?これは、コンピュータでは浮動小数点数が 2 進数形式で格納されるため、0.1 と 0.2 は 2 進数に変換すると無限に繰り返される 10 進数となり、コンピュータがそれらを格納するために使用できる桁数は限られているためです。したがって、コンピューターが 0.1 と 0.2 をバイナリに変換する場合、それらは正確に正確に保存されず、最終結果はわずかに異なります。この偏差は加算演算中に蓄積され、結果が期待値と等しくなくなります。
PHP では、2 つの浮動小数点数が等しいかどうかを比較する方法が複数あります。以下にそれらの方法を紹介しましょう。
round() 関数は、浮動小数点数を指定した桁数に丸めることができます。したがって、2 つの浮動小数点数が等しいかどうかを比較する場合は、最初にround() 関数を使用してそれらを同じ小数点以下の桁数に四捨五入してから比較することができます。
例:
$a = 0.1 + 0.2; $b = 0.3; $precision = 14; if (round($a, $precision) == round($b, $precision)) { echo "Equal"; } else { echo "Not Equal"; }
上の例では、$precision 変数は四捨五入する小数点以下の桁数を指定します。この例では、round() 関数を使用して 2 つの数値を小数点以下 14 桁に四捨五入し、それらを比較して正しい結果を取得します。
正確な浮動小数点数の比較を実行する必要がある場合は、PHP が提供する正確な計算ライブラリを使用できます。このライブラリは、浮動小数点数の高精度な計算を実行できるいくつかの関数を提供し、浮動小数点数演算で発生するエラーを回避します。
一般的に使用される正確な計算ライブラリには、BC Math ライブラリや GMP ライブラリなどがあります。どちらのライブラリもさまざまな高精度浮動小数点演算を実行できる一連の関数を提供しており、計算結果は実際の結果と同じです。
例:
$a = "0.1"; $b = "0.2"; $c = "0.3"; $sum = bcadd($a, $b, 2); // 计算a和b的和 if (bccomp($sum, $c, 2) == 0) { // 比较计算结果和期望结果 echo "Equal"; } else { echo "Not Equal"; }
上の例では、bcadd() 関数を使用して $sum 変数の値を計算し、次に bccomp() 関数を使用して $sum を比較します。と $c 値が等しいかどうか。 bccomp() 関数は、等しい場合は 0、$sum が $c より大きい場合は 1、$sum が $c より小さい場合は -1 を返します。
以上がPHP における浮動小数点数が等しくない問題について議論するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。