PHP 在会计中将长浮点数四舍五入到小数点后两位
PHP Round up long float to two decimals in accounting
假设您有这个数字 562.9444445
并且您希望将其四舍五入到小数点后两位。现在我会说结果将是 562.95
因为 5 从尾部向上移动。没有?
嗯,PHP round function 不是这样的。它只会检查下一个数字,在本例中是第 3 个和 return 562.94
.
我已经尝试使用 $mode
参数的所有常量值,但其中 none 个 return 是正确的结果。
我很想知道是否有人遇到过这种情况,是否有更精确的舍入函数可以使用。
我找到了 this comment that can be useful 但我 think/hope 可能存在其他东西。
<?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
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
如果您需要使用圆形函数,有些选项不适合您:
<!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
假设您有这个数字 562.9444445
并且您希望将其四舍五入到小数点后两位。现在我会说结果将是 562.95
因为 5 从尾部向上移动。没有?
嗯,PHP round function 不是这样的。它只会检查下一个数字,在本例中是第 3 个和 return 562.94
.
我已经尝试使用 $mode
参数的所有常量值,但其中 none 个 return 是正确的结果。
我很想知道是否有人遇到过这种情况,是否有更精确的舍入函数可以使用。
我找到了 this comment that can be useful 但我 think/hope 可能存在其他东西。
<?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
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
如果您需要使用圆形函数,有些选项不适合您:
<!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