PHPで数値値を処理する場合、特に浮動小数点数を計算する場合、精度偏差の問題に遭遇することがよくあります。これは、コンピューターの基礎となるレイヤーがバイナリフローティングポイント番号を使用して表現しているためであり、いくつかの小数点をバイナリに正確に変換できないため、計算プロセス中にエラーが発生します。
PHPは、IEEE 754標準に従って、値を3つの部分に分割し、符号ビット、指数(注文コード)、およびかなりの数字(メジデリ)に分割します。特定の小数(0.1または0.2など)をバイナリに変換すると、10進の無限のループがしばしば発生し、エラーが発生します。
$number = 0.1 + 0.2;
echo $number; // 出力 0.30000000000000004
上記のコードでは、0.1と0.2の合計は0.3でなければなりませんが、下部に浮動小数点数が近似しているため、出力結果に予期しないエラーがあります。
$price = 1.0;
$quantity = 0.8;
$total = $price * $quantity;
echo $total; // 出力 0.80
結果は出力から0.80ですが、より複雑な操作または比較操作では、このような小さなエラーは論理的な判断エラーまたは不正確な量の計算につながる可能性があります。
一般的なトリックは、フローティングポイント数値を整数に変換して計算に参加し、それを要件に従って元の数値値に復元するために、対応する倍数で除算することです。この方法は、財務単位または測定単位で精度エラーが回避されるシナリオに適しています。
$price = 10;
$quantity = 8;
$total = $price * $quantity / 10;
echo $total; // 出力 8.0
この方法は、整数乗算のために元の0.8と1.0から10と8を変換することにより、浮動小数点エラーを回避し、最終的に10で割って精度を回復します。
PHPの組み込みBCMATH拡張機能は、浮動小数点数の精度の問題を解決するように設計されています。開発者は、文字列モードで任意の精度で任意の10進操作を実行できます。
echo bcadd('0.1', '0.2', 1); // 出力 0.3
BCMATHのBCADD()関数は、2つの数値文字列と予約済みの小数の場所を受け取り、追加操作を正確に実行し、フローティングポイントエラーの問題を完全に回避します。
実際の開発、特に金融、在庫、分数計算などのビジネスシナリオでは、複雑な計算にPHPネイティブの浮動小数点数を使用しないようにすることが重要です。精度が必要なシナリオでBCMATH拡張を使用するか、整数変換戦略を使用して計算プロセスと結果の信頼性を確保することをお勧めします。