round()模式ROUND_HALF_DOWN,PHP 5.2.17

时间:2011-08-18 06:25:20

标签: php mode rounding

我需要在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, '.', '' );
}

4 个答案:

答案 0 :(得分:6)

你可以通过简单地转换成一个字符串然后回来作弊:

$num = 1.895;

$num = (string) $num;

if (substr($num, -1) == 5) $num = substr($num, 0, -1) . '4';

$num = round(floatval($num), 2);

修改

您可以在函数形式中使用它:

echo round_half_down(25.2568425, 6); // 25.256842

function round_half_down($num, $precision = 0)
{
    $num = (string) $num;
    $num = explode('.', $num);
    $num[1] = substr($num[1], 0, $precision + 1);
    $num = implode('.', $num);

    if (substr($num, -1) == 5)
        $num = substr($num, 0, -1) . '4';

    return round(floatval($num), $precision);
}

答案 1 :(得分:3)

对于PHP 5.3之前的最简单的方法似乎是从所需精度中的最后一个数字后面的数字中减去1。因此,如果你有精度2并希望1.995变为1.99,则从数字和舍入中减去.001。这将始终返回正确的回合,除了半值将向下舍入而不是向上。

示例1:

$num = 1.835;
$num = $num - .001; // new number is 1.834
$num = round($num,2);
echo $num;

四舍五入后的值现在为1.83

对于另一个精度,您只需调整从中减去1的位置。

示例2:

$num = 3.4895;
$num = $num - .0001; // new number is 3.4894
$num = round($num, 3);
echo $num;

四舍五入后的值现在为3.489

如果你想要一个函数来处理工作,那么以下函数就是这样做的。

function round_half_down($num,$precision)
{ 
    $offset = '0.';
    for($i=0; $i < $precision; $i++)
    {
        $offset = $offset.'0';
    }

    $offset =  floatval($offset.'1');
    $num = $num - $offset;
    $num = round($num, $precision);

    return $num;
}

答案 2 :(得分:2)

你可以取下0.5 ^ p,其中p是精度,然后使用ceiling:

<?php

function round_half_down($v, $prec) {
  $v = $v * pow(10,$prec) - 0.5;
  return ceil($v) * pow(10,-$prec);
}


print round_half_down(9.5,0) . "\n";
print round_half_down(9.05,0) . "\n";
print round_half_down(9.051,0) . "\n";
print round_half_down(9.05,1) . "\n";
print round_half_down(9.051,1) . "\n";
print round_half_down(9.055,2) . "\n";
print round_half_down(1.896,2) . "\n";

?>

的产率:

$ php test.php 
9
9
9
9
9.1
9.05
1.9

你会注意到,对于任何数字x&lt; = p&lt; = x.5,我们得到上限(p - 0.5)= x,并且对于所有x + 1 =&gt; p> x.5,我们得到上限(p - 0.5)= x + 1。这应该是你想要的。

答案 3 :(得分:0)

您可以使用preg_replace:

$string = '1.895';
$pattern = '/(\d+).(\d+)/e';
$replacement = "'\\1'.'.'.((substr($string, -1) > 5) ?  (substr('\\2',0,2) + 1)  :  substr('\\2',0,2))";
echo preg_replace($pattern, $replacement, $string);