Javascript: arrotondare per eccesso al successivo multiplo di 5


113

Ho bisogno di una funzione di utilità che assuma un valore intero (compreso tra 2 e 5 cifre di lunghezza) che arrotondi per eccesso al successivo multiplo di 5 anziché al multiplo più vicino di 5. Ecco cosa ho ottenuto:

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

Quando corro round5(32), mi dà 30, dove voglio 35.
Quando corro round5(37), mi dà 35, dove voglio 40.

Quando corro round5(132), mi dà 130, dove voglio 135.
Quando corro round5(137), mi dà 135, dove voglio 140.

eccetera...

Come faccio a fare questo?


3
Dovrebbe round5(5)dare 5 o 10?
user2357112 supporta Monica

1
Che ne dici di: dividere x per 5, arrotondare per eccesso al numero intero più vicino (utilizzando la funzione Math.ceil) e quindi moltiplicare per 5?
Martin Wilson,

2
round5 (5) dovrebbe dare 5
Amit Erandole

Risposte:


271

Questo farà il lavoro:

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

È solo una variazione dell'arrotondamento comune numberal multiplo più vicino della xfunzione Math.round(number/x)*x, ma usando .ceilinvece di .roundfa sempre arrotondare per eccesso invece che per difetto / per eccesso secondo le regole matematiche.


potresti spiegare un po 'come sei arrivato a questa soluzione così velocemente? Pensavo che Math.ceil arrotonda solo per eccesso i decimali a numeri interi.
Amit Erandole

2
Bene, qui viene arrotondato all'intero intero, @AmitErandole;)
Michael Krelin - hacker

1
+1 per compatto ed efficiente ... e arrotonderà a 10, giusto? :)
zx81

Aggiungerei un altro parametro a questa funzione, indicando il "rounder", quindi il numero originale può essere arrotondato a qualsiasi cosa abbiamo impostato nella chiamata di funzione e non solo fissato 5 ...
TheCuBeMan

3
Amo questa soluzione! L'ho implementato con una chiusura per cambiare convenientemente il multiplo inline secondo necessità: const roundToNearestMultipleOf = m => n => Math.round(n/m)*mUtilizzo:roundToNearestMultipleOf(5)(32)
gfullam

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

In questo modo il numero verrà arrotondato al 5 più vicino. Per arrotondare sempre al 5 più vicino, utilizzare Math.ceil. Allo stesso modo, per arrotondare sempre per difetto, usa Math.floorinvece di Math.round. Puoi quindi chiamare questa funzione come faresti con qualsiasi altra. Per esempio,

roundToNearest5(21)

sarà di ritorno:

20

La risposta accettata è effettivamente sbagliata. Questo è il modo corretto. Funziona anche con decimali come 2.5
Oliver Dixon


5

Sono arrivato qui mentre cercavo qualcosa di simile. Se il mio numero è —0, —1, —2 dovrebbe arrivare a —0, e se è —3, —4, —5 dovrebbe arrivare a —5.

Ho trovato questa soluzione:

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

E i test:

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
Questo può essere ottenuto più semplicemente usandoMath.round
Spencer Stolworthy il

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 ;

Saluti Paul


0

// round con precisione

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

// arrotondare a 5 con precisione

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

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

motivo per utilizzare round è che l'input previsto può essere un numero casuale.

Grazie!!!


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

può essere?


ReferenceError: intnon è definito. Forse lo volevi parseInt, ma non sarebbe necessario poiché Math.floorrestituisce un numero.
pawel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.