PHP 的「精確」解決方法對於精確的 2 位數貨幣計算是否可靠?

Linda Hamilton
發布: 2024-11-07 06:39:02
原創
542 人瀏覽過

Is PHP's `precision` Workaround Reliable for Precise 2-Digit Money Calculations?

我可以依靠 PHP PHP.INI 精確度解決浮點問題嗎?

簡介

浮點運算涉及將小數表示為二進制分數,可能沒有精確的表示。這可能會導致舍入錯誤。

問題 1:

此解決方法能否確保精確的 2 位數貨幣計算?

答案 1:

否。 PHP 精度設定無法保證精確的 2 位元計算,因為計算過程中可以提高精度。

問題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)
登入後複製

問題3:

哪個php.ini. precision 值最適合2位數貨幣計算?

答案 3:

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為了保持一致性,建議進行貨幣計算。也可以選擇以美分儲存。

更新

問題 1:對於 0..999999.99 之間的數字,精確度解決方法會失敗嗎?

答案 1:

是的,由於組合數量較多,完整的測試是不切實際的。

範例:

$a = 0.19;
$b = 0.16;
...
$h = $a + $b + ...; // Total value: 0.4

$i = $h - $a - $b - ...; // Result: 1.0408341E-17 (expected: 0.00)
登入後複製

問題 2:如何估計精確度解決方法何時失敗?

答案2:

數學解是存在的,但不在本次討論的範圍內。

以上是PHP 的「精確」解決方法對於精確的 2 位數貨幣計算是否可靠?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!