広く使用されているサーバー側のスクリプト言語として、PHPは、浮動小数点数を計算するときに精度損失の問題に直面することがよくあります。これは主に、浮動小数点数がコンピューター内のバイナリ数で表されているという事実に由来し、多くの小数点以下数値をバイナリ番号で正確に表すことはできず、丸めと切り捨てエラーをもたらします。計算プロセスが進むにつれて、これらの小さなエラーは蓄積し続け、最終的に結果の精度に影響します。
単純なフローティングポイント操作でさえ、予期しないエラーを引き起こす可能性があります。例えば:
$num1 = 0.1;
$num2 = 0.2;
$sum = $num1 + $num2;
echo $sum; // 出力は厳密ではありません0.3,それはおおよその価値です
これは、毎日のコーディングでは、浮動小数点数の操作がもたらす可能性のある不確実性に常に注意を払う必要があることを示しています。
一般的な方法は、浮動小数点数値を整数に変換して計算を実行し、完了後にそれらをフローティングポイント番号に戻すことです。これにより、浮動小数点精度の損失のリスクを効果的に減らすことができます。例えば:
$num1 = 0.1;
$num2 = 0.2;
$sum = (intval($num1 * 100) + intval($num2 * 100)) / 100;
echo $sum; // 出力0.3
PHPの組み込みBCMATH拡張機能は、正確なデシマが必要なシナリオに適したBCADD()、BCSUB()、BCMUL()、BCDIV()などの高精度の数学関数のセットを提供します。例は次のとおりです。
$num1 = '0.1';
$num2 = '0.2';
$sum = bcadd($num1, $num2, 1);
echo $sum; // 出力0.3
通常、等号を使用してフローティングポイント数を直接比較することは信頼できません。 2つの浮動小数点数の差の絶対値がこのしきい値よりも少ないかどうかを決定することにより、等価を決定するためにエラーしきい値を設定する必要があります。例えば:
$num1 = 0.1 + 0.2;
$num2 = 0.3;
if (abs($num1 - $num2) < 0.0001) {
echo '等しい';
} else {
echo '不等しい';
}
浮動小数点数の精度の問題は、コンピューターサイエンスの一般的な問題であり、PHPも例外ではありません。整数計算、BCMATH拡張、エラートレランスの比較などの戦略を採用することにより、浮動小数点数の操作エラーによって引き起こされるトラブルを効果的に回避できます。実際の開発では、計算結果の正確性と手順の安定性を確保するために、特定のビジネスニーズに基づいて合理的に選択する必要があります。
この記事が貴重なリファレンスを提供し、PHPフローティングポイント番号処理のヘルプを提供できることを願っています。