Come posso arrotondare un numero in Javascript?


228

Come posso arrotondare un numero in JavaScript?

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

Non sono sicuro che esista un modo migliore per farlo se non quello di separarlo nel punto decimale per mantenere il primo bit. Ci deve essere...


21
Arrotondare verso zero o verso l'infinito negativo?
Daniel Brückner,

Risposte:



60

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

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

L'arrotondamento verso zero - di solito chiamato Truncate(), ma non supportato da JavaScript - può essere emulato usando 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()

Grazie per la completezza ma la capitalizzazione è sbagliata ... e in java-script che fa una GRANDE differenza. Altrimenti avrei votato qui.
George,

Ho aggiornato la risposta in modo che la capitalizzazione sia corretta.
Chasen,

18
@ George ENORME o enorme? : D
m93a,

1
Puoi ottenere lo stesso effetto di round-to-zero via x | 0.
Ahmed Fasih,

28

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

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

EDIT Math.floor() è non lento dell'uso di | operatore. Grazie a Jason S per aver controllato il mio lavoro.

Ecco il codice che ho usato per testare:

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 );

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

4
Ho appena ripetuto il test con 500000 numeri in virgola mobile, ci sono voluti circa lo stesso tempo, circa 625 msec.
Jason S,

5
Quindi non vedo quanto 1.25usec sia molto lento.
Jason S,

3
Non posso discutere con i tuoi dati :) Penso che potrei aver confuso l'implementazione di JS con ActionScript (costruita su EcmaScript; ovviamente l'implementazione differisce). Grazie per aver controllato il mio lavoro!
Geraldalewis,

14
Non fanno neanche la stessa cosa. |converte in un numero intero a 32 bit, troncando; Math.floorarrotonda per difetto. jsfiddle.net/minitech/UVG2w
Ry-

21

Puoi provare a utilizzare questa funzione se devi arrotondare per difetto 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

Penso che un one-liner come questo non richieda una funzione.
Hubert Grzeskowiak,

4
roundDown (4.56, 2) ti dà 4.55, quindi non credo sia una buona soluzione.
Cryss,

6

Per arrotondare per difetto all'infinito negativo, utilizzare:

rounded=Math.floor(number);

Per arrotondare per difetto a zero (se il numero può arrotondare a un numero intero a 32 bit compreso tra -2147483648 e 2147483647), utilizzare:

rounded=number|0;

Per arrotondare per difetto a zero (per qualsiasi numero), utilizzare:

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

5

L'arrotondamento di numberverso 0può essere fatto sottraendo la sua parte frazionata firmata number % 1:

rounded = number - number % 1;

Mi piace Math.floor(si gira verso-Infinity ) questo metodo è perfettamente preciso.

Esistono differenze nella gestione e -0, tuttavia:+Infinity-Infinity

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

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

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

3
Math.floor(1+7/8)

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

18
In realtà è (7/8) +1 che non è 1. Grazie algebra di 3 ° grado
Joe Phillips,

1
Umm, per favore, prova questo in un programma JavaScript. L'ho fatto. Visualizza (1 + 7/8) e vedrai 1.875. Math.round (...) è 2, Math.floor (...) è 1. Di cosa state parlando?
DigitalRoss,

1
Oppure apri Firefox Error Console. O Firebug. Non è difficile da provare. L'ho provato. 1 + 7/8 è 1.875 in js. Hai forse dimenticato che tutta la matematica in js è in virgola mobile?
DigitalRoss,

3
Probabilmente è facile dimenticare che javascript fa tutto in virgola mobile. In molte altre lingue 1 + 7/8 è 1, ma in js è davvero 1.875.
DigitalRoss,

3

Stavo armeggiando con il codice di qualcun altro oggi e ho trovato quanto segue che sembra arrotondare per difetto:

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

Per ulteriori informazioni sullo spostamento destro a propagazione dei segni (>>) consultare Operatori bit per bit MDN

Mi ci è voluto un po 'per capire cosa stesse facendo: D

Ma come sottolineato sopra, Math.floor () funziona e sembra più leggibile secondo me.


3
Uccide anche in silenzio il tuo numero se non si adatta a 32 bit. Console Chromium: 99999999999999999999999 | 0 => -167772160
Matthias Urlichs

0

Devi mettere -1 per arrotondare per metà e poi moltiplicare per -1 come nell'esempio qui 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>

Onestamente In questa comunità, preferiamo risposte come @phoebus fornite sopra.
Ankit Pandey,

0

Ecco math.floor utilizzato in un semplice esempio. Questo potrebbe aiutare un nuovo sviluppatore a farsi un'idea di come usarlo in una funzione e di cosa fa. Spero che sia d'aiuto!

<script>

var marks = 0;

function getRandomNumbers(){    //  generate a random number between 1 & 10
    var number = Math.floor((Math.random() * 10) + 1);
    return number;
}

function getNew(){  
/*  
    This function can create a new problem by generating two random numbers. When the page is loading as the first time, this function is executed with the onload event and the onclick event of "new" button.
*/
document.getElementById("ans").focus();
var num1 = getRandomNumbers();
var num2 = getRandomNumbers();
document.getElementById("num1").value = num1;
document.getElementById("num2").value = num2;

document.getElementById("ans").value ="";
document.getElementById("resultBox").style.backgroundColor = "maroon"
document.getElementById("resultBox").innerHTML = "***"

}

function checkAns(){
/*
    After entering the answer, the entered answer will be compared with the correct answer. 
        If the answer is correct, the text of the result box should be "Correct" with a green background and 10 marks should be added to the total marks.
        If the answer is incorrect, the text of the result box should be "Incorrect" with a red background and 3 marks should be deducted from the total.
        The updated total marks should be always displayed at the total marks box.
*/

var num1 = eval(document.getElementById("num1").value);
var num2 = eval(document.getElementById("num2").value);
var answer = eval(document.getElementById("ans").value);

if(answer==(num1+num2)){
    marks = marks + 10;
    document.getElementById("resultBox").innerHTML = "Correct";
    document.getElementById("resultBox").style.backgroundColor = "green";
    document.getElementById("totalMarks").innerHTML= "Total marks : " + marks;

}

else{
    marks = marks - 3;
    document.getElementById("resultBox").innerHTML = "Wrong";
    document.getElementById("resultBox").style.backgroundColor = "red";
    document.getElementById("totalMarks").innerHTML = "Total Marks: " + marks ;
}




}

</script>
</head>

<body onLoad="getNew()">
    <div class="container">
        <h1>Let's add numbers</h1>
        <div class="sum">
            <input id="num1" type="text" readonly> + <input id="num2" type="text" readonly>
        </div>
        <h2>Enter the answer below and click 'Check'</h2>
        <div class="answer">
            <input id="ans" type="text" value="">
        </div>
        <input id="btnchk" onClick="checkAns()" type="button" value="Check" >
        <div id="resultBox">***</div>
        <input id="btnnew" onClick="getNew()" type="button" value="New">
        <div id="totalMarks">Total marks : 0</div>  
    </div>
</body>
</html>
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.