浮點運算涉及將小數表示為二進制分數,可能沒有精確的表示。這可能會導致舍入錯誤。
此解決方法能否確保精確的 2 位數貨幣計算?
否。 PHP 精度設定無法保證精確的 2 位元計算,因為計算過程中可以提高精度。
解決方法失敗時的範例:
ini_set('precision', 8); $a = 5.88; // cost of 1kg $q = 2.49; // User buys 2.49 kg $b = $a * 0.01; // 10% Discount only on first kg echo ($a * $q) - $b; // result: 14.5824 (not precise for money calculations)
哪個php.ini. precision 值最適合2位數貨幣計算?
PHP 精確度為不是精確財務計算的建議指標。
使用 bcmath、number_format 和減法:
$a = 342349.23; $b = 341765.07; ini_set('precision', 20); echo $a - $b, PHP_EOL; // 584.15999999997438863 echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding issue) echo number_format($a - $b, 2), PHP_EOL; // 584.16 echo bcsub($a, $b, 2), PHP_EOL; // 584.15 (precision set to 20) ini_set('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 (precision set to 14) ini_set('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 (precision set to 6) ini_set('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 echo bcsub($a, $b, 2), PHP_EOL; // 0.00 (precision set to 3)
使用 number_format為了保持一致性,建議進行貨幣計算。也可以選擇以美分儲存。
是的,由於組合數量較多,完整的測試是不切實際的。
$a = 0.19; $b = 0.16; ... $h = $a + $b + ...; // Total value: 0.4 $i = $h - $a - $b - ...; // Result: 1.0408341E-17 (expected: 0.00)
數學解是存在的,但不在本次討論的範圍內。
以上是PHP 的「精確」解決方法對於精確的 2 位數貨幣計算是否可靠?的詳細內容。更多資訊請關注PHP中文網其他相關文章!