ホームページ  >  記事  >  バックエンド開発  >  PHP の php.ini の精度設定は、2 桁の金額計算の正確さを保証できますか?

PHP の php.ini の精度設定は、2 桁の金額計算の正確さを保証できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-06 12:27:03303ブラウズ

 Can PHP's php.ini Precision Setting Guarantee Accurate Two-Digit Monetary Calculations?

PHP の php.ini の精度回避策は浮動小数点の問題に対処できますか?

浮動小数点の計算は、ほとんどの分数がバイナリ表現であるため不正確になる可能性があります。 php.ini の精度設定により、PHP が浮動小数点値を計算する桁数を指定できます。

回避策の信頼性

質問 1:正確な 2 桁の通貨計算に信頼できる回避策はありますか?

回答 1: いいえ。php.ini の精度設定では、精度の長さが増加する可能性があるため、正確な 2 桁の計算が保証されません。

失敗の例

質問 2: 回避策が失敗する例を教えてください。

例:

ini_set('precision', 8);
$a = 5.88; // cost per kg
$q = 2.49; // quantity purchased (2.49 kg)
$b = $a * 0.01; // 10% discount on first kg
echo ($a * $q) - $b; // result not precisely two digits

2 桁の金銭計算に最適な Php.ini.precision 値

質問 3: 2 桁に適した php.ini.precision 値はどれですか

回答 3: 財務計算に php.ini の精度を使用することはお勧めできません。 bcmmath やnumber_format などの代替ソリューションを検討してください。

簡単なテスト

コード例:

ini_set('precision', 20); // set to 20
$a = 342349.23;
$b = 341765.07;

echo $a - $b, PHP_EOL;
echo floatval(round($a - $b, 2)), PHP_EOL;
echo number_format($a - $b, 2), PHP_EOL;
echo bcsub($a, $b, 2), PHP_EOL;

出力:

584.15999999997438863
584.15999999999996817    // round is not reliable
584.16
584.15  // bcsub is more precise with precision=20

結論:

php.ini の精度回避策への依存は、正確な 2 桁の計算には信頼できません。正確な財務計算を行うには、bcmmath またはnumber_format の使用を検討してください。

Update

質問 1: 0 ~ 999999.99 の数値に対して回避策は失敗しますか?

回答 1: 組み合わせが多数あるため、完全なテストは非現実的です。ただし、0.19 0.16 ... 0.01 を使用した単純なテストでは、精度が 8 に設定された予期しない結果 (1.0408341E-17) が生成され、回避策が完全に信頼できるものではないことが示唆されています。

質問 2: 回避策がいつ失敗するかをどのように推定できますか?

答え 2: 数式は存在しますが、複雑になる可能性があり、失敗点を特定するのに必ずしも実用的であるとは限りません。

以上がPHP の php.ini の精度設定は、2 桁の金額計算の正確さを保証できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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