IT TIP

PHP에서 가장 가까운 5의 배수로 올림

itqueen 2020. 12. 31. 23:12
반응형

PHP에서 가장 가까운 5의 배수로 올림


52로 호출 할 때 55를 반환하는 PHP 함수를 원합니다.

나는 round()기능을 시도했다 :

echo round(94, -1); // 90

90을 반환 하지만 95를 원합니다 .

감사.


선호하는 반올림 규칙에 따라 여러 가지 방법으로 수행 할 수 있습니다.

1. 5 다음 배수로 반올림 하고 현재 숫자를 제외합니다.

동작 : 50 개의 출력 55, 52 개의 출력 55

function roundUpToAny($n,$x=5) {
    return round(($n+$x/2)/$x)*$x;
}

2. 5 가장 가까운 배수로 반올림 하고 현재 숫자를 포함합니다.

동작 : 50 개 출력 50 개, 52 개 출력 55 개, 50.25 개 출력 50 개

function roundUpToAny($n,$x=5) {
    return (round($n)%$x === 0) ? round($n) : round(($n+$x/2)/$x)*$x;
}

3. 정수로 올림 한 다음 가장 가까운 5의 배수로 올림

동작 : 50 출력 50, 52 출력 55, 50.25 출력 55

function roundUpToAny($n,$x=5) {
    return (ceil($n)%$x === 0) ? ceil($n) : round(($n+$x/2)/$x)*$x;
}

  1. 5로 나누기
  2. round()(또는 ceil() 항상 반올림하려는 경우 )
  3. 5를 곱합니다.

값 5 (해상도 / 세분성)는 무엇이든 될 수 있습니다. 1 단계와 3 단계 모두에서 대체됩니다.


내림 :

$x = floor($x/5) * 5;

모으다:

$x = ceil($x/5) * 5;

가장 가까운 값으로 반올림 (위 또는 아래) :

$x = round($x/5) * 5;

내가 작성한이 작은 기능을 사용해보십시오.

function ceilFive($number) {
    $div = floor($number / 5);
    $mod = $number % 5;

    If ($mod > 0) $add = 5;
    Else $add = 0;

    return $div * 5 + $add;
}

echo ceilFive(52);

   echo $value - ($value % 5);

나는 그것이 오래된 질문이라는 것을 알고 있지만 모듈러스 연산자를 사용하는 IMHO가 가장 좋은 방법이며 받아 들여지는 대답보다 훨씬 우아합니다.


에서 기어 라이브러리

MathType::roundStep(50, 5); // 50
MathType::roundStep(52, 5); // 50
MathType::roundStep(53, 5); // 55

MathType::floorStep(50, 5); // 50
MathType::floorStep(52, 5); // 50
MathType::floorStep(53, 5); // 50

MathType::ceilStep(50, 5); // 50
MathType::ceilStep(52, 5); // 55
MathType::ceilStep(53, 5); // 55

출처:

public static function roundStep($value, int $step = 1)
{
    return round($value / $step) * $step;
}

public static function floorStep($value, int $step = 1)
{
    return floor($value / $step) * $step;
}

public static function ceilStep($value, int $step = 1)
{
    return ceil($value / $step) * $step;
}

2를 곱하고 -1로 반올림하고 2로 나눕니다.


내 버전의 Musthafa 기능이 있습니다. 이것은 더 복잡하지만 정수뿐만 아니라 Float 숫자지원합니다 . 반올림 할 숫자는 문자열 일 수도 있습니다.

/**
 * @desc This function will round up a number to the nearest rounding number specified.
 * @param $n (Integer || Float) Required -> The original number. Ex. $n = 5.7;
 * @param $x (Integer) Optional -> The nearest number to round up to. The default value is 5. Ex. $x = 3;
 * @return (Integer) The original number rounded up to the nearest rounding number.
 */
function rounduptoany ($n, $x = 5) {

  //If the original number is an integer and is a multiple of 
  //the "nearest rounding number", return it without change.
  if ((intval($n) == $n) && (!is_float(intval($n) / $x))) {

    return intval($n);
  }
  //If the original number is a float or if this integer is 
  //not a multiple of the "nearest rounding number", do the 
  //rounding up.
  else {

    return round(($n + $x / 2) / $x) * $x;
  }
}

I tried the functions from Knight, Musthafa and even the suggestion from Praesagus. They don't have support for Float numbers and the solutions from Musthafa's & Praesagus do not work correctly in some numbers. Try the following test numbers and do the comparison yourself:

$x= 5;

$n= 200;       // D = 200     K = 200     M = 200     P = 205
$n= 205;       // D = 205     K = 205     M = 205     P = 210
$n= 200.50;    // D = 205     K = 200     M = 200.5   P = 205.5
$n= '210.50';  // D = 215     K = 210     M = 210.5   P = 215.5
$n= 201;       // D = 205     K = 205     M = 200     P = 205
$n= 202;       // D = 205     K = 205     M = 200     P = 205
$n= 203;       // D = 205     K = 205     M = 205     P = 205

** D = DrupalFever K = Knight M = Musthafa P = Praesagus

I do it like this:

private function roundUpToAny(int $n, $x = 9)
{
    return (floor($n / 10) * 10) + $x;
}

Tests:

assert($this->roundUpToAny(0, 9) == 9);
assert($this->roundUpToAny(1, 9) == 9);
assert($this->roundUpToAny(2, 9) == 9);
assert($this->roundUpToAny(3, 9) == 9);
assert($this->roundUpToAny(4, 9) == 9);
assert($this->roundUpToAny(5, 9) == 9);
assert($this->roundUpToAny(6, 9) == 9);
assert($this->roundUpToAny(7, 9) == 9);
assert($this->roundUpToAny(8, 9) == 9);
assert($this->roundUpToAny(9, 9) == 9);
assert($this->roundUpToAny(10, 9) == 19);
assert($this->roundUpToAny(11, 9) == 19);
assert($this->roundUpToAny(12, 9) == 19);
assert($this->roundUpToAny(13, 9) == 19);
assert($this->roundUpToAny(14, 9) == 19);
assert($this->roundUpToAny(15, 9) == 19);
assert($this->roundUpToAny(16, 9) == 19);
assert($this->roundUpToAny(17, 9) == 19);
assert($this->roundUpToAny(18, 9) == 19);
assert($this->roundUpToAny(19, 9) == 19);

function round_up($n, $x = 5) {
  $rem = $n % $x;
  if ($rem < 3)
     return $n - $rem;
  else
     return $n - $rem + $x;
}

I just wrote this function in 20 min, based on many results I found here and there, I don't know why it works or how it works!! :D

I was mainly interested in converting currency numbers from this 151431.1 LBP to 150000.0 LBP. (151431.1 LBP == ~100 USD) which works perfectly so far, however I tried to make it somehow compatible with other currencies and numbers, but not sure if it works fine!!

/**
 * Example:
 * Input = 151431.1 >> return = 150000.0
 * Input = 17204.13 >> return = 17000.0
 * Input = 2358.533 >> return = 2350.0
 * Input = 129.2421 >> return = 125.0
 * Input = 12.16434 >> return = 10.0
 *
 * @param     $value
 * @param int $modBase
 *
 * @return  float
 */
private function currenciesBeautifier($value, int $modBase = 5)
{
    // round the value to the nearest
    $roundedValue = round($value);

    // count the number of digits before the dot
    $count = strlen((int)str_replace('.', '', $roundedValue));

    // remove 3 to get how many zeros to add the mod base
    $numberOfZeros = $count - 3;

    // add the zeros to the mod base
    $mod = str_pad($modBase, $numberOfZeros + 1, '0', STR_PAD_RIGHT);

    // do the magic
    return $roundedValue - ($roundedValue % $mod);
}

Feel free to modify it and fix it if there's anything wrong


Probably you can also consider this one liner. It's faster! Works for $num >= 0 and $factor > 0.

$num = 52;
$factor = 55;
$roundedNum = $num + $factor - 1 - ($num + $factor - 1) % $factor;

ReferenceURL : https://stackoverflow.com/questions/4133859/round-up-to-nearest-multiple-of-five-in-php

반응형