Ниже представлена функция для округления до целых чисел либо 0.5. Причем алгоритм функции работает не по математическому округлению, а по некой вилке диапазона десятичных значений.
/**
* Округление чисел до 0.5 или целых
*
* @param mixed $val
* @return float
*/
function roundHalf($val)
{
$val = round($val, 1);
$arr = explode('.', $val);
if (empty($arr[1]) || in_array($arr[1], array(1, 2, 3))) {
$res = $arr[0];
} elseif (in_array($arr[1], array(4, 5, 6))) {
$res = $arr[0] . '.5';
} else {
if ($val > 0) {
$res = ceil($val);
} else {
$res = floor($val);
}
}
return floatval($res);
}
Результаты работы функции:
-1 => float(-1)
-0.9 => float(-1)
-0.8 => float(-1)
-0.7 => float(-1)
-0.6 => float(-0.5)
-0.5 => float(-0.5)
-0.4 => float(-0.5)
-0.3 => float(-0)
-0.2 => float(-0)
-0.1 => float(-0)
0 => float(0)
0.1 => float(0)
0.2 => float(0)
0.3 => float(0)
0.4 => float(0.5)
0.5 => float(0.5)
0.6 => float(0.5)
0.7 => float(1)
0.8 => float(1)
0.9 => float(1)
1 => float(1)
Нужно обратить внимание на отрицательные значения, например для значения «-0.9
» функция вернет «1
». Функция ceil()
с отрицательными работает в другую сторону: