浮點運算是一個經常被誤解的複雜主題,它遍布現代電腦系統。由於大多數小數缺乏精確的二進位表示,因此不可避免地會發生舍入。了解浮點運算的細微差別至關重要,如「每個電腦科學家應該了解浮點算術知識」所述。
答案: 不,您不能依賴 php。 ini 精度設定以實現一致的 2 位元精度,即使對於低於 10^6 的數字也是如此,因為計算過程中精度長度可能會增加。
答案:考慮以下範例,僅對第一公斤應用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
答案: 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 精確度設定進行精確計算的不一致。
為了可靠的金融計算,忘記浮點並使用分或考慮使用 number_format 函數以獲得一致的 2 位精度。
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中文網其他相關文章!