ホームページ >バックエンド開発 >PHPチュートリアル >正確なお金の計算のために PHP の `php.ini` の精度に頼ることはできますか?
浮動小数点演算は、誤解されがちな複雑な主題であり、現代のコンピューター システムに浸透しています。ほとんどの小数は正確な 2 進表現に欠けているため、丸めが避けられません。 「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」で概説されているように、浮動小数点演算の微妙な違いを理解することは非常に重要です。
回答: いいえ、php に依存することはできません。精度の長さが計算中に増加する可能性があるため、10^6 未満の数値であっても、一貫した 2 桁の精度を実現するための ini 精度設定。
答え: 最初のキログラムにのみ 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 桁の計算ではありません
回答: 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;
以上が正確なお金の計算のために PHP の `php.ini` の精度に頼ることはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。