Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中精确地对分数进行上舍入和下舍入的函数,有更好的方法吗?_Php_Function_Math - Fatal编程技术网

在PHP中精确地对分数进行上舍入和下舍入的函数,有更好的方法吗?

在PHP中精确地对分数进行上舍入和下舍入的函数,有更好的方法吗?,php,function,math,Php,Function,Math,我在php.net上找到了这段代码,它适用于我的总结部分 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

我在php.net上找到了这段代码,它适用于我的总结部分

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';} 
 }
函数向上取整($value,$precision=0){
如果(!空($value)){
$sign=(0$precision){
$next=(int)substr($amt[1],$precision);
$amt[1]=(float)(('..substr($amt[1],0,$precision))*$sign);
如果(0!=$next){
如果(+1==$sign){
$amt[1]=$amt[1]+(浮动)((“.”.str_repeat('0',$precision-1)。'1')*$sign);
} 
} 
} 
否则{
$amt[1]=(浮动)((“..$amt[1])*$sign);
} 
返回$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';}
 } 
函数向下取整($value,$precision=0){
如果(!空($value)){
$sign=(0$precision){
$next=(int)substr($amt[1],$precision);
$amt[1]=(float)(('..substr($amt[1],0,$precision))*$sign);
如果(0!=$next){
如果(-1==$sign){
$amt[1]=$amt[1]-(浮动)((“.”.str_repeat('0',$precision-1)。'1')*$sign);
} 
} 
} 
否则{
$amt[1]=(浮动)((“..$amt[1])*$sign);
} 
返回$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
$azd=0.0130;
$azd1=数字格式(四舍五入($azd,2),4);
$azd2=数字格式(四舍五入($azd,2),4);
$azd3=数字格式(四舍五入($azd,1),4);
$azd4=数字格式(向下取整($azd,1),4);
回音“向上取整=”.$azd1.
”;//0.0200 回音“向下取整=”.$azd2.
”;//0.0100 回音“向上取整=”.$azd3.
;//0.1000 回音'Round_down='。$azd4.
';//0
以上答案对我不适用,我从


有额外选项的回合()会不会很好?四舍五入
0.0130
给出
0.1
?你在做什么样的计算?@NullUserException他正在将数值四舍五入到小数点后1的某个精度。@JohnCartwright在这种情况下,
0.0130
应该给你
0.0
@NullUserException你假设四舍五入是基于5或更高的数值。事实并非如此,因为它会盲目地将任何值舍入到给定的精度。0.01变为0.1,精度为1。啊,你赢了我!投票结果=]基本上与Kolink的答案相同,只是你用整个表达式替换了他们的
$power
变量。如果你看我在他的帖子上的评论,他在我提交时回答,这不是副本,这只是最好的方式。我没有说这是副本,只是这是相同的答案。
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);
}
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;
   }
}