Intereting Posts
Функция PHP use () для области видимости? удалять пробелы из кодированной строки base64 при публикации http: //localhost/index.php перенаправление на http: // localhost / xampp / REGEX для маскировки всех символов, кроме первого и последнего символов удалить кеш с помощью префикса в apc / memcache / eaccelerator Создание нового массива из входа Laravel 4 PHP strtotime проблемы с минутами Laravel 5: Как разбивать Ajax-ответ Вложенные 'for' циклы в PHP для создания иерархического неупорядоченного списка Как вызвать замыкание, которое является переменной класса? Как динамически заполнять параметры в выпадающих списках на основе выбора в другом раскрывающемся списке? Проблемы с настройкой SSL на AWS Elastic Beanstalk Webserver (один экземпляр) PHP PHP 5.4: отключить предупреждение «Создание объекта по умолчанию из пустого значения» Значение сеанса только после перезагрузки страницы Как записать файл в PHP?

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

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

Я пробовал функцию 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); 

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

Умножьте на 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; } } 

Я пробовал функции от рыцаря , 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 
 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); } 

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