Javascript: округніть до наступного кратного 5


114

Мені потрібна функція утиліти, яка приймає ціле значення (від 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
Як щодо: розділити х на 5, округнути до найближчого цілого числа (використовуючи функцію Math.ceil), а потім помножити на 5?
Мартін Вілсон

2
тур 5 (5) повинен дати 5
Аміт Ерандоле

Відповіді:


271

Це зробить роботу:

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

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

3
Я люблю це рішення! Я реалізував це із закриттям, щоб зручно змінити декілька const roundToNearestMultipleOf = m => n => Math.round(n/m)*mroundToNearestMultipleOf(5)(32)
gfullam

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

Це округлює число до найближчого 5. Щоб завжди округлювати до найближчого 5, використовуйте Math.ceil. Так само, щоб завжди округлювати, використовуйте Math.floorзамість Math.round. Потім ви можете викликати цю функцію, як і будь-яку іншу. Наприклад,

roundToNearest5(21)

повернеться:

20

Прийнята відповідь насправді неправильна. Це правильний шлях. Також працює з десятковими
Олівер Діксон


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повертає номер.
pawel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.