2009-10-12 145 views
2

我有以下功能回合數爲$最近數字結尾最接近的數字,我想知道是否有做同樣的一個更優雅的方式四捨五入到最接近的結局位數

/** 
* Rounds the number to the nearest digit(s). 
* 
* @param int $number 
* @param int $nearest 
* @return int 
*/ 

function roundNearest($number, $nearest, $type = null) 
{ 
    $result = abs(intval($number)); 
    $nearest = abs(intval($nearest)); 

    if ($result <= $nearest) 
    { 
     $result = $nearest; 
    } 

    else 
    { 
     $ceil = $nearest - substr($result, strlen($result) - strlen($nearest)); 
     $floor = $nearest - substr($result, strlen($result) - strlen($nearest)) - pow(10, strlen($nearest)); 

     switch ($type) 
     { 
      case 'ceil': 
       $result += $ceil; 
      break; 

      case 'floor': 
       $result += $floor; 
      break; 

      default: 
       $result += (abs($ceil) <= abs($floor)) ? $ceil : $floor; 
      break; 
     } 
    } 

    if ($number < 0) 
    { 
     $result *= -1; 
    } 

    return $result; 
} 

一些例子:提前

roundNearest(86, 9); // 89 
roundNearest(97, 9); // 99 
roundNearest(97, 9, 'floor'); // 89 

謝謝!

PS:這個問題是不是四捨五入到最接近多個

+0

你爲什麼要重新發明輪子? – markus 2009-10-12 16:21:57

回答

5

這個工作對我來說:

function roundToDigits($num, $suffix, $type = 'round') { 
    $pow = pow(10, floor(log($suffix, 10) + 1)); 
    return $type(($num - $suffix)/$pow) * $pow + $suffix; 
}; 

$type應該是 「小區」, 「樓」,或者 「圓圓」

+0

總是向下舍入數字,返回'79','89'和'89'作爲我的問題中提供的示例。 – 2010-01-07 22:11:24

+0

您是否更改'$ type'參數? 'roundToDigits(94,9''floor')== 89','roundToDigits(94,9''ceil')== 99','roundToDigits(94,9''round')== 99' – nickf 2010-01-07 22:55:34

+0

Ooops ,不,我沒有! :O整潔的解決方案,我只是改變'$ pow = pow(10,floor(log($ suffix,10)+ 1));'來處理小數。謝謝! – 2012-04-11 22:12:03

2

我認爲這應該工作,這是更優雅對我來說,至少:

function roundNearest($number, $nearest, $type = null) 
{ 
    if($number < 0) 
    return -roundNearest(-$number, $nearest, $type); 

    $nearest = abs($nearest); 
    if($number < $nearest) 
    return $nearest; 

    $len = strlen($nearest); 
    $pow = pow(10, $len); 
    $diff = $pow - $nearest; 

    if($type == 'ciel') 
    $adj = 0.5; 
    else if($type == 'floor') 
    $adj = -0.5; 
    else 
    $adj = 0; 

    return round(($number + $diff)/$pow + $adj)*$pow - $diff; 
} 

編輯:添加了什麼我認爲你從負輸入想要

+0

有太多的重複,它是優雅的。 – slikts 2009-10-12 19:10:11

+0

@Reinis I:好的,我把它變成了一個小玩意兒。 – Kip 2009-10-12 21:21:56