ホームページ  >  記事  >  バックエンド開発  >  正確なお金の計算のために PHP の `php.ini` の精度に頼ることはできますか?

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-06 10:27:02816ブラウズ

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

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

はじめに

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

質問と回答


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

回答: いいえ、php に依存することはできません。精度の長さが計算中に増加する可能性があるため、10^6 未満の数値であっても、一貫した 2 桁の精度を実現するための 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 <- --- 正確な 2 桁の計算ではありません

質問 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 の精度設定に依存する場合の矛盾を示しています。

gt;結論

信頼性の高い財務計算を行うには、浮動小数点のことは忘れて、セントまたはセントを使用してください。一貫した 2 桁の精度を得るには、number_format 関数を検討してください。

Update

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;

以上が正確なお金の計算のために PHP の `php.ini` の精度に頼ることはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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