PHP 5.2.17 的 round() 模式 ROUND_HALF_DOWN
我需要在 PHP 5.2.17 中模拟 ROUND_HALF_DOWN 模式 - 我无法升级服务器的 PHP 版本。有什么想法如何实现这一目标?
基本思想是 1.895 变成 1.89,而不是像通常使用 round() 那样变成 1.90。
编辑: 这个函数似乎可以解决问题:
function nav_round($v, $prec = 2) {
// Seems to fix a bug with the ceil function
$v = explode('.',$v);
$v = implode('.',$v);
// The actual calculation
$v = $v * pow(10,$prec) - 0.5;
$a = ceil($v) * pow(10,-$prec);
return number_format( $a, 2, '.', '' );
}
I need to simulate ROUND_HALF_DOWN mode in PHP 5.2.17 - I cannot upgrade the server's PHP version. Any ideas how to achieve this?
The basic idea is that 1.895 becomes 1.89, not 1.90 like it usually does with round().
EDIT:
This function seems to do the trick:
function nav_round($v, $prec = 2) {
// Seems to fix a bug with the ceil function
$v = explode('.',$v);
$v = implode('.',$v);
// The actual calculation
$v = $v * pow(10,$prec) - 0.5;
$a = ceil($v) * pow(10,-$prec);
return number_format( $a, 2, '.', '' );
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以通过简单地转换为字符串并返回来进行作弊:
编辑:
这里以函数形式提供它:
You can cheat by simply converting to a string and back:
EDIT:
Here you have it in function form:
在 PHP 5.3 之前,最简单的方法似乎是从所需精度的最后一个数字后面的数字中减去 1。因此,如果精度为 2 并且希望 1.995 变为 1.99,只需从数字和舍入中减去 0.001。这将始终返回正确的舍入,除了半值将向下舍入而不是向上舍入。
示例 1:
四舍五入后的值现在为 1.83
对于另一个精度,您只需调整减去 1 的位置即可。
示例 2:
四舍五入后的值现在是 3.489
如果您想要一个函数来处理这项工作,请使用以下函数。
It seems the easiest method for this prior to PHP 5.3 is to subtract 1 from the number following the last number in the required precision. So if you have precision 2 and want 1.995 to become 1.99 just subtract .001 from the number and round. This will always return a correct round except that the half value will round down rather than up.
Example1:
The value after rounding is now 1.83
For another precision you just adjust where you subtract the 1 from.
Example2:
The value after rounding is now 3.489
If you want a function to handle the work the following function does that.
您可以去掉 0.5^p,其中 p 是精度,然后使用上限:
产量:
您会注意到,对于任何数字 x <= p <= x.5,我们得到上限(p - 0.5) = x,对于所有 x+1 => p> x.5,我们得到上限(p - 0.5) = x+1。这应该正是您想要的。
You can take off 0.5^p where p is the precision and then use ceiling:
yields:
You'll note that for any number x <= p <= x.5, we get ceiling(p - 0.5) = x, and for all x+1 => p > x.5, we get ceiling(p - 0.5) = x+1. This should be exactly what you want.
您可以使用 preg_replace 来实现此目的:
You can use the preg_replace for this: