Функция PHP Round - округлить до 2 дп?
В PHP как бы округлить значение 22.04496, чтобы оно стало 22.05? Похоже, раунд (22,04496,2) = 22,04. Разве это не должно быть 22.05?
заранее спасибо
6 ответов
Вы можете сделать это используя ceil, умножив и разделив на 10.
echo ceil( 1.012345 * 1000)/1000;
1.013
Не делайте умножения внутри функции "потолок", "пол" или "круг"! Вы получите ошибки с плавающей запятой, и это может быть крайне непредсказуемым. Чтобы избежать этого, сделайте:
function ceiling($value, $precision = 0) {
$offset = 0.5;
if ($precision !== 0)
$offset /= pow(10, $precision);
$final = round($value + $offset, $precision, PHP_ROUND_HALF_DOWN);
return ($final == -0 ? 0 : $final);
}
Например ceiling(2.2200001, 2)
дам 2.23
,
Основываясь на комментариях, я также добавил функцию пола, так как у нее похожие проблемы:
function flooring($value, $precision = 0) {
$offset = -0.5;
if ($precision !== 0)
$offset /= pow(10, $precision);
$final = round($value + $offset, $precision, PHP_ROUND_HALF_UP);
return ($final == -0 ? 0 : $final);
}
Функция округления в PHP может обрабатывать дополнительный аргумент, который управляет выполнением округления: http://php.net/manual/en/function.round.php
Примеры по ссылке:
echo round(9.5, 0, PHP_ROUND_HALF_UP); // 10
echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
echo round(9.5, 0, PHP_ROUND_HALF_ODD); // 9
Я думаю, что лучший способ:
echo ceil(round($value * 100)) / 100;
Пример:
$value = 77.4;
echo ceil($value * 100) / 100; // 77.41 - WRONG!
echo ceil(round($value * 100)) / 100; // 77.4 - OK!
Это не работает хорошо.
round(1.211,2,PHP_ROUND_HALF_UP);
// Res: 1.21
Мое решение:
$number = 1.211;
echo myCeil($number,2);
function myCeil($number,$precision = 0){
$pow = pow(10,$precision);
$res = (int)($number * $pow) / $pow;
if($number > $res){
$res += 1 / $pow;
}
return $res;
}
// Res 1.22
Почему это должно быть 22.05
? Третье десятичное число меньше 5, следовательно, когда вы округляете его с точностью до 2 десятичного знака, оно округляется до 22.04