我在 php.net 上找到了这段代码,它适用于我的 round_up 部分..
function round_up($value, $precision = 0) {
if (!empty($value)) {
$sign = (0 <= $value) ? +1 : -1;
$amt = explode('.', $value);
$precision = (int) $precision;
if (strlen($amt[1]) > $precision) {
$next = (int) substr($amt[1], $precision);
$amt[1] = (float) (('.'.substr($amt[1], 0, $precision)) * $sign);
if (0 != $next) {
if (+1 == $sign) {
$amt[1] = $amt[1] + (float) (('.'.str_repeat('0', $precision - 1).'1') * $sign);
}
}
}
else {
$amt[1] = (float) (('.'.$amt[1]) * $sign);
}
return $amt[0] + $amt[1];
}
else {echo 'error';}
}
添加了几个减号..以获得这个...
function round_down($value, $precision = 0) {
if (!empty($value)) {
$sign = (0 <= $value) ? +1 : -1;
$amt = explode('.', $value);
$precision = (int) $precision;
if (strlen($amt[1]) > $precision) {
$next = (int) substr($amt[1], $precision);
$amt[1] = (float) (('.'.substr($amt[1], 0, $precision)) * $sign);
if (0 != $next) {
if (-1 == $sign) {
$amt[1] = $amt[1] - (float) (('.'.str_repeat('0', $precision - 1).'1') * $sign);
}
}
}
else {
$amt[1] = (float) (('.'.$amt[1]) * $sign);
}
return $amt[0] + $amt[1];
}
else {echo 'error';}
}
有没有更好的方法? (我只需要它用于正小数)目前在大多数情况下它都可以正常工作,没有太多故障..
$azd = 0.0130;
$azd1 = number_format(round_up($azd,2),4);
$azd2 = number_format(round_down($azd,2),4);
$azd3 = number_format(round_up($azd,1),4);
$azd4 = number_format(round_down($azd,1),4);
echo 'Round_up = '.$azd1.'<br>'; // 0.0200
echo 'Round_down = '.$azd2.'<br>'; // 0.0100
echo 'Round_up = '.$azd3.'<br>'; // 0.1000
echo 'Round_down = '.$azd4.'<br>'; // 0.0000
function round_up($value, $precision=0) {
$power = pow(10,$precision);
return ceil($value*$power)/$power;
}
function round_down($value, $precision=0) {
$power = pow(10,$precision);
return floor($value*$power)/$power;
}
function round_up($float,$mod) {
return ceil($float * pow(10,$mod)) / pow(10,$mod);
}
function round_down($float,$mod=0) {
return floor($float * pow(10,$mod)) / pow(10,$mod);
}
上述答案对我不起作用,我从 PHP Ceil 和 Floor 得到这些,并四舍五入到最接近的 100
function ceiling($number, $significance) {
if ($significance != null) {
return (is_numeric($number) && is_numeric($significance) ) ? (ceil($number / $significance) * $significance) : $number;
} else {
return $number;
}
}
function flooring($number, $significance) {
if ($significance != null) {
return (is_numeric($number) && is_numeric($significance) ) ? (floor($number / $significance) * $significance) : $number;
} else {
return $number;
}
}
为了将某个值舍入为正确的值,需要支持正值和负值:
function round_up(int $value, int $precision = 0): int {
$power = pow(10, $precision);
if ($value > 0) {
return ceil($value * $power) / $power;
}
return floor($value * $power) / $power;
}
round_up(3.14159, 1) // 3.2
round_up(-3.14159, 1) // -3.2
function round_down(int $value, int $precision = 0): int {
$power = pow(10, $precision);
if ($value > 0) {
return floor($value * $power) / $power;
}
return ceil($value * $power) / $power;
}
round_down(3.14159, 1); // 3.1
round_down(-3.14159, 1); // -3.1
注意:其他答案将在向上取整时返回
-3.1
,在向下取整时返回 -3.2
。
注意:Excel 对于负值的行为如下。