「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 正確なお金の計算のために PHP の `php.ini` の精度に頼ることはできますか?

正確なお金の計算のために PHP の `php.ini` の精度に頼ることはできますか?

2024 年 11 月 19 日に公開
ブラウズ:451

 Can I Rely on PHP's `php.ini` Precision for Accurate Money Calculations?

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

はじめに

浮動小数点演算は、誤解されがちな複雑な主題であり、現代のコンピューター システムに浸透しています。ほとんどの小数は正確な 2 進表現に欠けているため、丸めが避けられません。 「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」で概説されているように、浮動小数点演算の微妙な違いを理解することが重要です。

質問と回答


質問 1: 正確な 2 桁の計算に精度の回避策を使用できますか (例:お金)?

答え: いいえ、10^6 未満の数値であっても、一貫した 2 桁の精度を得るために php.ini の精度設定に依存することはできません。長さは計算中に増加する可能性があります。

質問 2: 精度を回避する明確な例を提供してください。

答え: 最初のキログラムにのみ 10% 割引が適用される次の例を考えてみましょう:

ini_set('precision', 8); // Your precision
$a = 5.88; // Cost of 1kg
$q = 2.49; // User buys 2.49 kg
$b = $a * 0.01; // 10% Discount only on the first kg
echo ($a * $q) - $b;

出力: 14.5824

質問 3: php.ini はどれですか.precision 値は 2 桁のお金の計算に適していますか?

答え: PHP 精度設定財務計算や浮動小数点精度の信頼できる基礎ではありません。特殊なライブラリまたはメソッドを使用することをお勧めします。

計算例

精度の制限を説明するためにさまざまな例を調べてみましょう:

$a = 342349.23;
$b = 341765.07;

// Example A: precision = 20
echo $a - $b, PHP_EOL; // 584.15999999997438863
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding introduces instability)
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.15

// Example B: precision = 14
echo $a - $b, PHP_EOL; // 584.15999999997
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.16

// Example C: precision = 6
echo $a - $b, PHP_EOL; // 584.16
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.00

// Example D: precision = 3
echo $a - $b, PHP_EOL; // 584
echo floatval(round($a - $b, 2)), PHP_EOL; // 584
echo number_format($a - $b, 2), PHP_EOL; // 584.16 (consistent)
echo bcsub($a, $b, 2), PHP_EOL; // 0.00

これらの例は、正確な計算を行うために PHP の精度設定に依存する際の矛盾を示しています。

結論

信頼できる財務計算を行うには、忘れてください。浮動小数点についてはセントを使用するか、一貫した 2 桁の number_format 関数を検討してください。精度.

更新

ini_set('precision', 8);

$a = 0.19;
$b = 0.16;
$c = 0.01;
$d = 0.01;
$e = 0.01;
$f = 0.01;
$g = 0.01;
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3