Javascript: округлить до следующего кратного 5


115

Мне нужна служебная функция, которая принимает целочисленное значение (от 2 до 5 цифр в длину), которое округляется до следующего кратного 5 вместо ближайшего кратного 5. Вот что я получил:

function round5(x)
{
    return (x % 5) >= 2.5 ? parseInt(x / 5) * 5 + 5 : parseInt(x / 5) * 5;
}

Когда я бегу round5(32), он дает мне 30, где я хочу, 35.
Когда я бегаю round5(37), он дает мне 35, где я хочу, 40.

Когда я бегу round5(132), он дает мне 130, где я хочу, 135.
Когда я бегаю round5(137), он дает мне 135, где я хочу, 140.

и т.д...

Как мне это сделать?


3
Должен round5(5)дать 5 или 10?
user2357112 поддерживает Монику

1
Как насчет того, чтобы разделить x на 5, округлить до ближайшего целого числа (с помощью функции Math.ceil), а затем умножить на 5?
Мартин Уилсон,

2
round5 (5) должен дать 5
Амит Эрандол

Ответы:


276

Это сделает всю работу:

function round5(x)
{
    return Math.ceil(x/5)*5;
}

Это просто вариант обычного округления numberдо ближайшего кратного xфункции Math.round(number/x)*x, но использование .ceilвместо .roundделает его всегда округлять вверх, а не вниз / вверх в соответствии с математическими правилами.


не могли бы вы немного объяснить, как вы пришли к этому решению так быстро? Я думал, что Math.ceil только округляет десятичные дроби до целых чисел.
Амит Эрандол

2
Ну, здесь округляется до целого числа, @AmitErandole;)
Майкл Крелин - хакер

1
+1 за компактность и эффективность ... и округлим до 10, верно? :)
zx81 09

Я бы добавил к этой функции еще один параметр, указывающий на «округление», чтобы исходное число можно было округлить до того, что мы установили в вызове функции, а не только фиксированного 5 ...
TheCuBeMan

3
Обожаю это решение! Я реализовал это с закрытием для удобного изменения множественного встроенного по мере необходимости: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mИспользование:roundToNearestMultipleOf(5)(32)
gfullam

13
const roundToNearest5 = x => Math.round(x/5)*5

Это округлит число до ближайшего 5. Чтобы всегда округлять до ближайшего 5, используйте Math.ceil. Точно так же, чтобы всегда округлять в меньшую сторону, используйте Math.floorвместо Math.round. Затем вы можете вызвать эту функцию, как любую другую. Например,

roundToNearest5(21)

вернется:

20

Принятый ответ на самом деле неверен. Это правильный путь. Также работает с десятичными знаками, такими как 2,5
Оливер Диксон


5

Я приехал сюда в поисках чего-то похожего. Если мое число равно –0, –1, –2, оно должно упасть до –0, а если –3, –4, –5, оно должно упасть до –5.

Я придумал такое решение:

function round(x) { return x%5<3 ? (x%5===0 ? x : Math.floor(x/5)*5) : Math.ceil(x/5)*5 }

И тесты:

for (var x=40; x<51; x++) {
  console.log(x+"=>", x%5<3 ? (x%5===0 ? x : Math.floor(x/5)*5) : Math.ceil(x/5)*5)
}
// 40 => 40
// 41 => 40
// 42 => 40
// 43 => 45
// 44 => 45
// 45 => 45
// 46 => 45
// 47 => 45
// 48 => 50
// 49 => 50
// 50 => 50

1
Это можно сделать проще, используяMath.round
Спенсер Столворти,

2
voici 2 solutions possibles :
y= (x % 10==0) ? x : x-x%5 +5; //......... 15 => 20 ; 37 => 40 ;  41 => 45 ; 20 => 20 ; 

z= (x % 5==0) ? x : x-x%5 +5;  //......... 15 => 15 ; 37 => 40 ;  41 => 45 ; 20 => 20 ;

С уважением Пол


0

// округление с точностью

var round = function (value, precision) {
    return Math.round(value * Math.pow(10, precision)) / Math.pow(10, precision);
};

// округляем до 5 с точностью

var round5 = (value, precision) => {
    return round(value * 2, precision) / 2;
}

0
const fn = _num =>{
    return Math.round(_num)+ (5 -(Math.round(_num)%5))
}

Причина использования раунда в том, что ожидаемый ввод может быть случайным числом.

Спасибо!!!


-2
if( x % 5 == 0 ) {
    return int( Math.floor( x / 5 ) ) * 5;
} else {
    return ( int( Math.floor( x / 5 ) ) * 5 ) + 5;
}

может быть?


ReferenceError: intне определено. Может быть, вы хотели parseInt, но в этом нет необходимости, поскольку Math.floorвозвращает число.
Павел
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.