2013-09-23 27 views
52

Ho bisogno di una funzione di utilità che includa un valore intero (compreso tra 2 e 5 cifre) che va a successivo a multiplo di 5 anziché il più vicino multiplo di 5. Ecco cosa ho ottenuto:Javascript: Arrotondare al successivo multiplo di 5

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

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

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

ecc ...

Come posso fare Questo?

+3

caso 'round5 (5)' dare 5, o 10? – user2357112

+1

Che ne dici di: dividere x per 5, arrotondare al numero intero più vicino (usando la funzione Math.ceil) e poi moltiplicare per 5? –

+2

round5 (5) dovrebbe dare 5 –

risposta

126

Questo farà il lavoro:

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

E 'solo una variante del raccordo comuni number al più vicino multiplo di x funzione Math.round(number/x)*x, ma utilizzando .ceil invece di .round rende sempre arrotondare anziché verso il basso/su secondo le regole matematiche.

+0

potresti spiegare un po 'come sei arrivato a questa soluzione così in fretta? Pensavo che Math.ceil arrotonda solo i decimali a interi interi. –

+1

@AmitErandole OK, modificherò la mia risposta, – pawel

+0

+1 per la leggibilità – supertopi

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

forse?

+0

ReferenceError: 'int' non è definito. Forse volevi 'parseInt', ma questo non sarebbe stato necessario poiché' Math.floor' restituisce un numero. – pawel

4

Ti piace questo?

function roundup5(x) { return (x%5)?x-x%5+5:x } 
1
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

2

sono arrivato qui durante la ricerca di qualcosa di simile. Se il mio numero è -0, -1, -2 dovrebbe scendere a -0, e se è -3, -4, -5 dovrebbe arrivare a -5.

mi si avvicinò con questa soluzione:

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

E le prove:

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