Подтвердить что ты не робот

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

Мне нужна функция php, которая возвращает 55 при вызове 52.

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

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

Он возвращает 90, но я хочу 95.

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

  • Разделить на 5
  • round() (или ceil(), если вы хотите всегда округлять)
  • Умножить на 5.

Значение 5 (разрешение/гранулярность) может быть любым; заменил его на обоих этапах 1 и 3

Ответ 3

Раунд вниз:

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

Раунд вверх:

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

Ближайший (вверх или вниз):

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

Ответ 4

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

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

Ответ 5

   echo $value - ($value % 5);

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

Ответ 6

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

Ответ 7

Вот моя версия функции 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;
  }
}

Я пробовал функции Knight, Musthafa и даже предложение от Praesagus. У них нет поддержки чисел Float, а решения из Musthafa's и Praesagus работают неправильно в некоторых числах. Попробуйте следующие тестовые номера и сделайте сравнение самостоятельно:

$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

Ответ 8

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

Ответ 9

Я только что написал эту функцию за 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);
}

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