Округление до ближайшего кратного пяти в PHP


Я хочу функцию php, которая возвращает 55 при вызове его с 52.

Я пробовал round() функция:

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

возвращает 90 но я хочу!--7-->95.

спасибо.

11 52

11 ответов:

Это может быть достигнуто несколькими способами, в зависимости от ваших предпочтений округления:

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;
   echo $value - ($value % 5);

Я знаю, что это старый вопрос, но IMHO с использованием оператора модуля-лучший способ и гораздо более элегантный, чем принятый ответ.

попробуйте эту маленькую функцию, которую я написал.

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);

умножить на 2, округлить до -1, разделить на 2.

вот моя версия Musthafa это

С Gears библиотека

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;
}
function round_up($n, $x = 5) {
  $rem = $n % $x;
  if ($rem < 3)
     return $n - $rem;
  else
     return $n - $rem + $x;
}

Я просто написал эту функцию за 20 минут, основываясь на многих результатах, которые я нашел здесь и там, я не знаю, почему это работает или как это работает!! : D

меня в основном интересовало преобразование номеров валют из этого 151431.1 LBP в 150000.0 LBP. (151431.1 LBP = = ~100 USD) который отлично работает до сих пор, однако я попытался сделать его каким-то образом совместимым с другими валютами и числами, но не уверен, что он работает нормально!!

/**
 * 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);
}

Не стесняйтесь изменять его и исправить это если что-то не так

Я делаю это так:

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

тесты:

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);