浮点运算是一个经常被误解的复杂主题,它遍布现代计算机系统。由于大多数小数缺乏精确的二进制表示,因此不可避免地会发生舍入。了解浮点运算的细微差别至关重要,如“每个计算机科学家应该了解浮点算术知识”中所述。
答案: 不,您不能依赖 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中文网其他相关文章!