2010-01-15 54 views
2

我似乎無法弄清楚如何總是在PHP中取整。 ceil()將是明顯的選擇,但我需要與round()提供的第二個參數「precision」相同的功能。這裏是一個例子:PHP舍入號碼

 
// Desired result: 6250 
echo round(6244.64, -2); // returns 6200 
echo round(6244.64, -1); // returns 6240 
echo ceil(6244.64) // returns 6245 

我需要數字總是四捨五入,以便我可以計算基於圖表參數的等於除數。

回答

5

從評論http://php.net/manual/en/function.ceil.php

Quick and dirty `ceil` type function with precision capability. 

function ceiling($value, $precision = 0) { 
    return ceil($value * pow(10, $precision))/pow(10, $precision); 
} 
+0

我認爲操作順序爲混合起來,你需要劃分小區前,然後大量繁殖,而不是其他的方式,不是嗎? – nicolaskruchten 2010-01-15 20:43:24

+0

@njk:ceiling(6244.64,-1)給出了期望的結果6250.請注意,在這種情況下精度是負值。 – 2010-01-15 20:59:04

+0

這將返回true:'ceiling(77.4,2)=== 77.41'。功能被破壞。 – bzeaman 2017-04-15 09:18:38

0

您可以通過10,小區()分;然後用精密小區10個

-1

還有一個解決辦法繁殖,沒有戰俘,它看起來像作品9位兩側:

$v = 123400100100100101; 
$a1 = 444444444.4; 
$a2 = .04444444444; 
$b1 = 111111111.1; 
$b2 = .01111111111; 
echo $v . "\n"; 
for ($i = 0; $i < 18; $i ++) { 
    $v = $v/10; 
    for ($j = -9; $j < 10; $j++) { 
     echo $i . ':' . $j . ":" . round($v 
      + round($a1, $j + 1) + round($a2, $j + 1) 
      - round($a1, $j) - round($a2, $j) 
      + round($b1, $j + 1) + round($b2, $j + 1) 
      - round($b1, $j) - round ($b2, $j), 
      $j, PHP_ROUND_HALF_DOWN) . "\n"; 
    } 
} 
0

由於ceil(pow(10, $precision) * $value)/pow(10, $precision);版本無法在某些情況下,例如round_up(2.22,2)給出了不正確的2.23,如here所述,所以我已將這個string solution for round_down()修改爲我們的round_up()問題。這是結果(不包括負精度):

function round_up($value, $precision) {   
    $value = (float)$value; 
    $precision = (int)$precision; 
    if ($precision < 0) { 
     $precision = 0; 
    } 
    $decPointPosition = strpos($value, '.'); 
    if ($decPointPosition === false) { 
     return $value; 
    } 
    $floorValue = (float)substr($value, 0, $decPointPosition + $precision + 1); 
    $followingDecimals = (int)substr($value, $decPointPosition + $precision + 1); 
    if ($followingDecimals) { 
     $ceilValue = $floorValue + pow(10, -$precision); // does this give always right result? 
    } 
    else { 
     $ceilValue = $floorValue; 
    } 
    return $ceilValue;     
} 

我不知道它是防彈的,但至少可以消除上述失敗。我沒有做二進制到十進制數學分析,但如果$floorValue + pow(10, 0 - $precision)工作 總是如預期那麼它應該沒問題。如果你會發現一些失敗的案例讓我知道 - 我們應該尋找另一種解決方案:)

0

這些答案中的一些有浮點運算問題,可能會失敗,如this answer所示。在所有情況下防彈解決方案,使用這些:

/** 
* Used to round up based on the decimal place, for example rounding up to the nearest penny 
* http://stackoverflow.com/questions/8239600/rounding-up-to-the-second-decimal-place 
* @param float $value 
* @param integer $precision 
* @return number 
*/ 
public function Ceiling($value, $precision = 0) { 
    $offset = 0.5; 
    if ($precision !== 0) 
     $offset /= pow(10, $precision); 
    $final = round($value + $offset, $precision, PHP_ROUND_HALF_DOWN); 
    return ($final == -0 ? 0 : $final); 
} 

/** 
* Used to round up based on the decimal place, for example rounding up to the nearest penny 
* http://stackoverflow.com/questions/8239600/rounding-up-to-the-second-decimal-place 
* @param float $value 
* @param integer $precision 
* @return number 
*/ 
public function Floor($value, $precision = 0) { 
    $offset = -0.5; 
    if ($precision !== 0) 
     $offset /= pow(10, $precision); 
    $final = round($value + $offset, $precision, PHP_ROUND_HALF_UP); 
    return ($final == -0 ? 0 : $final); 
}