浮動小数点の計算は、ほとんどの分数がバイナリ表現であるため不正確になる可能性があります。 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
質問 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 の使用を検討してください。
質問 1: 0 ~ 999999.99 の数値に対して回避策は失敗しますか?
回答 1: 組み合わせが多数あるため、完全なテストは非現実的です。ただし、0.19 0.16 ... 0.01 を使用した単純なテストでは、精度が 8 に設定された予期しない結果 (1.0408341E-17) が生成され、回避策が完全に信頼できるものではないことが示唆されています。
質問 2: 回避策がいつ失敗するかをどのように推定できますか?
答え 2: 数式は存在しますが、複雑になる可能性があり、失敗点を特定するのに必ずしも実用的であるとは限りません。
以上がPHP の php.ini の精度設定は、2 桁の金額計算の正確さを保証できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。