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

Mary-Kate Olsen
リリース: 2024-11-06 10:27:02
オリジナル
814 人が閲覧しました

 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!