The original question can be found here.
While looking at PHP.net this afternoon, I saw a comment in round()
for two functions for rounding UP
and DOWN
(as opposed to just HALF_UP
and DOWN
). I liked the suggestion, but wanted a solution that was one function, instead of 3.
The comment that sparked this for me is here.
I removed unnecessary preg_replace
and got clever with xor
to ensure mimicking round()
behavior with negative numbers. As for the two empty()
checks, these ensure less overhead than arithmetic if the provided number is 0
. But I am open to arguments to remove them.
define('PHP_ROUND_UP', 11);
define('PHP_ROUND_DOWN', 12);
function fround($number, $precision = 0, $mode = PHP_ROUND_HALF_UP) {
if (is_numeric($number) && !empty($number)) {
switch($mode) {
case PHP_ROUND_UP:
case PHP_ROUND_DOWN:
if (!empty($precision)) {
$precision = pow(10, (int) $precision);
$number *= $precision;
}
if ($mode == PHP_ROUND_UP xor ($number < 0)) {
$number = ceil($number);
} else {
$number = floor($number);
}
if (!empty($precision) && !empty($number)) {
$number /= $precision;
}
break;
default:
$number = round($number, $precision, $mode);
break;
}
}
return (float) $number;
}