Javascript: Runden Sie auf das nächste Vielfache von 5 auf

113

Ich benötige eine Utility-Funktion, die einen ganzzahligen Wert (zwischen 2 und 5 Stellen) annimmt, der auf das nächste Vielfache von 5 anstatt auf das nächste Vielfache von 5 aufrundet. Folgendes habe ich erhalten:

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

Wenn ich renne round5(32), gibt es mir 30, wo ich 35 will.
Wenn ich renne round5(37), gibt es mir 35, wo ich 40 will.

Wenn ich renne round5(132), gibt es mir 130, wo ich 135 will.
Wenn ich renne round5(137), gibt es mir 135, wo ich 140 will.

etc...

Wie mache ich das?

Amit Erandole
quelle
3
Sollte round5(5)5 oder 10 geben?
user2357112 unterstützt Monica
1
Wie wäre es: x durch 5 teilen, auf die nächste ganze Zahl aufrunden (mit der Funktion Math.ceil) und dann mit 5 multiplizieren?
Martin Wilson
2
Runde 5 (5) sollte 5
Amit Erandole

Antworten:

270

Dies wird die Arbeit erledigen:

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

Es ist nur eine Variation der gemeinsamen Runden numberauf nächste Vielfache von xFunktion Math.round(number/x)*x, wobei jedoch .ceilstatt .roundmacht es immer rund oben statt nach unten / oben nach mathematischen Regeln.

pawel
quelle
Können Sie ein wenig erklären, wie Sie so schnell zu dieser Lösung gekommen sind? Ich dachte, Math.ceil rundet Dezimalstellen nur auf ganze Zahlen auf.
Amit Erandole
2
Nun, es rundet sich hier auf die ganze ganze Zahl ab, @AmitErandole;)
Michael Krelin - Hacker
1
+1 für kompakt und effizient ... und es wird auf 10 gerundet, oder? :)
zx81
Ich würde dieser Funktion einen weiteren Parameter hinzufügen, der den "Rounder" angibt, damit die ursprüngliche Nummer auf das gerundet werden kann, was wir im Funktionsaufruf festgelegt haben, und nicht nur 5 ...
TheCuBeMan
3
Ich liebe diese Lösung! Ich implementierte es mit einem Verschluss, um die Mehrfach-Inline nach Bedarf bequem zu ändern: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mVerwendung:roundToNearestMultipleOf(5)(32)
Gfullam
10
const roundToNearest5 = x => Math.round(x/5)*5

Dadurch wird die Zahl auf die nächste 5 gerundet. Um immer auf die nächste 5 aufzurunden, verwenden Sie Math.ceil. Um immer abzurunden, verwenden Sie Math.floorstattdessen anstelle von Math.round. Sie können diese Funktion dann wie jede andere aufrufen. Beispielsweise,

roundToNearest5(21)

wird zurückkehren:

20
Spencer Stolworthy
quelle
Die akzeptierte Antwort ist tatsächlich falsch. Dies ist der richtige Weg. Funktioniert auch mit Dezimalstellen wie 2.5
Oliver Dixon
5

So was?

function roundup5(x) { return (x%5)?x-x%5+5:x }
Michael Krelin - Hacker
quelle
5

Ich bin hier angekommen, als ich nach etwas Ähnlichem gesucht habe. Wenn meine Nummer -0, -1, -2 ist, sollte sie auf -0 steigen, und wenn sie -3, -4, -5 ist, sollte sie auf -5 begrenzt sein.

Ich habe mir diese Lösung ausgedacht:

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

Und die Tests:

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
AymKdn
quelle
1
Dies kann einfacher erreicht werden mitMath.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 ;

Grüße Paul

Paul Neulat
quelle
0

// mit Präzision runden

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

// mit Präzision auf 5 runden

var round5 = (value, precision) => {
    return round(value * 2, precision) / 2;
}
Dennis T.
quelle
0
const fn = _num =>{
    return Math.round(_num)+ (5 -(Math.round(_num)%5))
}

Grund für die Verwendung von round ist, dass die erwartete Eingabe eine Zufallszahl sein kann.

Vielen Dank!!!

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

vielleicht?

MyFantasy512
quelle
ReferenceError: intist nicht definiert. Vielleicht wollten Sie parseInt, aber dies wäre nicht notwendig, da Math.flooreine Nummer zurückgegeben wird.
Pawel