PHP在会计中将长浮点数四舍五入到小数点后两位

PHP Round up long float to two decimals in accounting

提问人:drew7721 提问时间:10/29/2020 更新时间:10/29/2020 访问量:365

问:

假设你有这个数字,你想把它四舍五入到小数点后 2 位。现在我想说的是,结果将是 5 从尾巴上抬起来。不?562.9444445562.95

好吧,PHP round 函数不是那样工作的。它只会检查下一个数字,在本例中为第 3 个数字并返回 .562.94

我已经尝试了参数的所有常量值,但它们都没有返回正确的结果。$mode

我很想知道是否有人遇到过这种情况,以及是否有更精确的舍入函数可以使用。

我发现这个评论可能很有用,但我认为/希望可能存在其他东西。

演示

<?php
$value = 562.9445;

echo round($value,1)."\n"; // return 562.9 (correctly)
echo round($value,2)."\n"; // return 562.94 (wrong)
echo round($value,3)."\n"; // return 562.945 (correctly)
PHP 十进制 四舍五入 精度 记帐

评论

3赞 Rob Moll 10/29/2020
No. 562.94 是正确的。
1赞 Sammitch 10/29/2020
1. 四舍五入不是这样工作的。2. 这个确切的原因就是为什么你永远不应该使用浮动来支付货币。
0赞 Chris Haas 10/29/2020
如果从最右边四舍五入,则将对已四舍五入的数字进行四舍五入。想象一下,当你四舍五入时,你从最让位的边缘四舍五入,会发生什么?

答:

2赞 Jasar Orion 10/29/2020 #1

您可以使用此功能

<?php
function round_up ( $value, $precision ) { 
    $pow = pow ( 10, $precision ); 
    return ( ceil ( $pow * $value ) + ceil ( $pow * $value - ceil ( $pow * $value ) ) ) / $pow; 
} 
$value = 562.9445;

echo round_up ($value,1)."\n"; // return 563  
echo round_up ($value,2)."\n"; // return 562.95 
echo round_up ($value,3)."\n"; // return 562.945

如果您需要使用 round 函数,则有一些选项不适合您:

<!DOCTYPE html>
<html>
<body>

<?php
$value = 562.9445;
echo(round($value,1,PHP_ROUND_HALF_UP) . "<br>");
echo(round($value ,2,PHP_ROUND_HALF_UP) . "<br>");
echo(round($value ,3,PHP_ROUND_HALF_UP) . "<br>");
echo ("<hr>");

echo(round($value ,1,PHP_ROUND_HALF_DOWN) . "<br>");
echo(round($value ,2,PHP_ROUND_HALF_DOWN) . "<br>");
echo(round($value ,3,PHP_ROUND_HALF_DOWN) . "<br>");
echo ("<hr>");
echo(round($value ,1,PHP_ROUND_HALF_EVEN) . "<br>");
echo(round($value ,2,PHP_ROUND_HALF_EVEN) . "<br>");
echo(round($value ,3,PHP_ROUND_HALF_EVEN) . "<br>");
echo ("<hr>");
echo(round($value ,1,PHP_ROUND_HALF_ODD) . "<br>");
echo(round($value ,2,PHP_ROUND_HALF_ODD) . "<br>");
echo(round($value ,3,PHP_ROUND_HALF_ODD));
?>

</body>
</html>

输出:

562.9
562.94
562.945
562.9
562.94
562.944
562.9
562.94
562.944
562.9
562.94
562.945