浮点运算涉及将小数表示为二进制分数,可能没有精确的表示。这可能会导致舍入错误。
此解决方法能否确保精确的 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 值适合最适合两位数货币计算?
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中文网其他相关文章!