Javascript: zaokrąglij w górę do następnej wielokrotności 5


115

Potrzebuję funkcji narzędzia, która przyjmuje wartość całkowitą (od 2 do 5 cyfr długości), która zaokrągla w górę do następnej wielokrotności 5 zamiast najbliższej wielokrotności 5. Oto, co otrzymałem:

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

Kiedy biegnę round5(32), to daje mi 30, gdzie chcę 35.
Kiedy biegam round5(37), daje mi 35, gdzie chcę 40.

Kiedy biegnę round5(132), daje mi to 130, gdzie chcę 135.
Kiedy biegam round5(137), daje mi to 135, gdzie chcę 140.

itp...

Jak mam to zrobic?


3
Powinien round5(5)dać 5 czy 10?
user2357112 obsługuje Monikę

1
A co powiesz na: podzielenie x przez 5, zaokrąglenie w górę do najbliższej liczby całkowitej (za pomocą funkcji Math.ceil), a następnie pomnożenie przez 5?
Martin Wilson

2
round5 (5) powinno dać 5
Amit Erandole

Odpowiedzi:


275

To wystarczy:

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

Jest to tylko odmiana zwykłego zaokrąglania numberdo najbliższej wielokrotności xfunkcji Math.round(number/x)*x, ale użycie .ceilzamiast .roundpowoduje, że zawsze zaokrągla w górę zamiast w dół / w górę zgodnie z zasadami matematycznymi.


czy mógłbyś trochę wyjaśnić, w jaki sposób doszedłeś do tego rozwiązania tak szybko? Myślałem, że Math.ceil zaokrągla tylko liczby dziesiętne w górę do całych liczb całkowitych.
Amit Erandole

2
Cóż, zaokrągla się w górę do całej liczby całkowitej, @AmitErandole;)
Michael Krelin - haker

1
+1 za kompaktowe i wydajne ... i zaokrągli do 10, prawda? :)
zx81

Dodałbym kolejny parametr do tej funkcji, wskazując „zaokrąglenie”, więc pierwotna liczba może zostać zaokrąglona do tego, co ustawimy w wywołaniu funkcji, a nie tylko ustalona 5 ...
TheCuBeMan

3
Uwielbiam to rozwiązanie! Zaimplementowałem to z zamknięciem do wygodnej zmiany wielu const roundToNearestMultipleOf = m => n => Math.round(n/m)*mroundToNearestMultipleOf(5)(32)
rzędów

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

Zaokrągli to liczbę do najbliższej 5. Aby zawsze zaokrąglić w górę do najbliższej 5, użyj Math.ceil. Podobnie, aby zawsze zaokrąglić w dół, użyj Math.floorzamiast Math.round. Możesz wtedy wywołać tę funkcję, tak jak każdą inną. Na przykład,

roundToNearest5(21)

wróci:

20

Przyjęta odpowiedź jest w rzeczywistości błędna. To jest właściwy sposób. Działa również z liczbami dziesiętnymi, takimi jak 2,5
Oliver Dixon


5

Przyjechałem tutaj, szukając czegoś podobnego. Jeśli mój numer to –0, –1, –2, powinien dochodzić do –0, a ​​jeśli jest –3, –4, –5, powinien sięgać –5.

Wymyśliłem takie rozwiązanie:

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

A testy:

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
Można to zrobić prościej, używającMath.round
Spencer Stolworthy

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 ;

Pozdrawiam Paul


0

// okrągłe z precyzją

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

// precyzyjnie zaokrąglij do 5

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

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

powodem używania round jest to, że oczekiwane dane wejściowe mogą być liczbą losową.

Dzięki!!!


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

może?


ReferenceError: intnie jest zdefiniowany. Może chciałeś parseInt, ale nie byłoby to konieczne, ponieważ Math.floorzwraca liczbę.
pawel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.