Всегда округлять десятичные дроби до указанной точности - PullRequest
2 голосов
/ 07 января 2012

Я ищу элегантный способ округления десятичных чисел всегда вверх.Похоже, round(0.0045001, 5, PHP_ROUND_HALF_UP); не возвращает то, что я ожидал, поэтому я придумал следующую функцию:

function roundUp($number, $precision) {
    $rounded = round($number, $precision);

    if ($rounded < $number) {
        $add = '0';
        for ($i = 1; $i <= $precision; $i++) {
            if ($i == 1) $add = '.';
            $add .= ($i == $precision) ? '1' : '0';
        }
        $add = (float) $add;
        $rounded = $rounded + $add;
    }

    return $rounded;
}

Мне было интересно, есть ли другой, более элегантный способ добиться этого?

Ожидаемый результат: var_dump(roundUp(0.0045001, 5)) // 0.00451;

Ответы [ 3 ]

4 голосов
/ 07 января 2012
function roundup_prec($in,$prec)
{
    $fact = pow(10,$prec);
    return ceil($fact*$in)/$fact;
}

echo roundup_prec(0.00450001,4)."\n";
echo roundup_prec(0.00450001,5);

дает:

0.0046
0.00451
0 голосов
/ 07 января 2012

Вместо ceil(x) вы также можете использовать (int)x, что дает тот же результат

РЕДАКТИРОВАТЬ: ОК, забудьте об этом, я имел в виду (int)x + 1, и это не так для числа, которое уже округлено.

0 голосов
/ 07 января 2012
function roundUp($number, $precision) {
    $rounded = round($number, $precision);

    if ($rounded < $number) {
        $add = '0';
        for ($i = 1; $i <= $precision; $i++) {
            if ($i == 1) $add = '.';
            $add .= ($i == $precision) ? '1' : '0';
        }
        $add = (float) $add;
        $rounded = $rounded + $add;
    }

    return ceil($rounded);
}
...