2009-09-16 14 views
189

Come posso arrotondare un numero in JavaScript?Come posso arrotondare un numero in Javascript?

math.round() non funziona perché lo arrotonda al decimale più vicino.

Non sono sicuro che ci sia un modo migliore per farlo, oltre a separarlo nel punto decimale per mantenere il primo bit. Ci deve essere ...

+19

Arrotondare verso lo zero o verso l'infinito negativo? –

risposta

363
Math.floor() 

è la risposta.

+2

È anche il metodo più lento; se è necessario eseguire molti di questi, utilizzare bitwise | operatore (vedi il mio post). – geraldalewis

+6

Il | l'operatore non funziona su numeri maggiori di 2147483647. –

+10

Il valore | anche l'operatore arrotonda verso lo zero, non l'infinito negativo. –

3
Math.floor(1+7/8) 
+0

1 + 7/8 = 1 - Non c'è molto bisogno di Math.floor() lì :) –

+16

In realtà è (7/8) +1 che non è 1. Grazie algebra di terza elementare –

+1

Umm, per favore provalo in un programma javascript. L'ho fatto. Mostra (1 + 7/8) e vedrai 1.875. Math.round (...) è 2, Math.floor (...) è 1. Di cosa state parlando ragazzi? – DigitalRoss

18

Math.floor() funzionerà, ma è molto lento rispetto all'utilizzo di un bit per bit OR operazione:

var rounded = 34.923 | 0; 
alert(rounded); 
//alerts "34" 

EDITMath.floor() è non più lento rispetto all'uso del | operatore. Grazie a Jason S per aver controllato il mio lavoro.

Ecco il codice che ho usato per prova:

var a = []; 
var time = new Date().getTime(); 
for(i = 0; i < 100000; i++) { 
    //a.push(Math.random() * 100000 | 0); 
    a.push(Math.floor(Math.random() * 100000)); 
} 
var elapsed = new Date().getTime() - time; 
alert("elapsed time: " + elapsed); 
+7

??? Ho appena eseguito jsdb (www.jsdb.org) che utilizza Spidermonkey 1.7 e ho eseguito un ciclo per riassumere il valore floor'ed di x [i] su un array di 100000 numeri in virgola mobile, prima con Math.floor(), poi con bit a bit o come suggerisci. Ci sono voluti circa allo stesso tempo, 125 msec. –

+2

Appena ripetuto il test con 500000 numeri in virgola mobile, ci sono voluti circa lo stesso tempo, circa 625 msec. –

+4

Quindi non vedo come 1.25usec è molto lento. –

55

rotonda verso l'infinito negativo - Math.floor()

+3.5 => +3.0 
-3.5 => -4.0 

rotonda verso lo zero - di solito chiamato Truncate(), ma non supportato da JavaScript - può essere emulato da utilizzando Math.ceil() per i numeri negativi e Math.floor() per i numeri positivi.

+3.5 => +3.0 using Math.floor() 
-3.5 => -3.0 using Math.ceil() 
+0

Grazie per la completezza ma la maiuscola è sbagliata ... e in java-script che fa una differenza enorme. Altrimenti avrei svalutato qui. – George

+0

Ho aggiornato la risposta in modo che la maiuscola sia corretta. – chasen

+15

@George ENORME o enorme? : D – m93a

2

stava armeggiando intorno con qualcuno elses codice di oggi e hanno trovato questa che sembra giri giù così:

var dec = 12.3453465, 
int = dec >> 0; // returns 12 

Per ulteriori informazioni sulla spostamento a destra Sign-moltiplicazione (>>) vedi MDN Bitwise Operators

mi c'è voluto un po 'per capire che cosa questo stava facendo: D

Ma, come evidenziato in precedenza, Math.floor() funziona e sembra più leggibile a mio parere.

+1

Uccide silenziosamente il tuo numero se non si adatta a 32 bit. Console Chromium: 9999999999999999999999999 | 0 => -167772160 –

16

Si può provare a utilizzare questa funzione se è necessario arrotondare a un numero specifico di cifre decimali

function roundDown(number, decimals) { 
    decimals = decimals || 0; 
    return (Math.floor(number * Math.pow(10, decimals))/Math.pow(10, decimals)); 
} 

esempi

alert(roundDown(999.999999)); // 999 
alert(roundDown(999.999999, 3)); // 999.999 
alert(roundDown(999.999999, -1)); // 990 
+0

Penso che un one-liner come questo non richiede una funzione. –

+0

roundDown (4.56, 2) ti dà 4,55, quindi non penso che sia una buona soluzione. – cryss

6

Per arrotondare verso l'infinito negativo, uso:

Per arrotondare verso il basso verso lo zero (se il numero può arrotondare a un numero intero a 32 bit tra it -2147483648 e 2147483647), uso:

rounded=number|0; 

per arrotondare fino a zero (per ogni numero), l'uso:

if(number>0)rounded=Math.floor(number);else rounded=Math.ceil(number); 
5

A completare un number verso 0 può essere fatto sottraendo la parte frazionaria firmato number % 1:

rounded = number - number % 1; 

Come Math.floor (giri verso -Infinity) questo metodo è perfettamente accurate.

Non ci sono differenze nella gestione dei -0, +Infinity e -Infinity se:

Math.floor(-0) => -0 
-0 - -0 % 1 => +0 

Math.floor(Infinity) => Infinity 
Infinity - Infinity % 1 => NaN 

Math.floor(-Infinity)  => -Infinity 
-Infinity - -Infinity % 1 => NaN 
-1

è necessario mettere da -1 a metà in tondo verso il basso e poi moltiplicare per -1 come nell'esempio in basso sotto.

<script type="text/javascript"> 

    function roundNumber(number, precision, isDown) { 
    var factor = Math.pow(10, precision); 
    var tempNumber = number * factor; 
    var roundedTempNumber = 0; 
    if (isDown) { 
     tempNumber = -tempNumber; 
     roundedTempNumber = Math.round(tempNumber) * -1; 
    } else { 
     roundedTempNumber = Math.round(tempNumber); 
    } 
    return roundedTempNumber/factor; 
    } 
</script> 

<div class="col-sm-12"> 
    <p>Round number 1.25 down: <script>document.write(roundNumber(1.25, 1, true));</script> 
    </p> 
    <p>Round number 1.25 up: <script>document.write(roundNumber(1.25, 1, false));</script></p> 
</div> 
Problemi correlati