Como arredondar um número em Javascript?

228

Como arredondar um número em JavaScript?

math.round() não funciona porque o arredonda para o decimal mais próximo.

Não tenho certeza se existe uma maneira melhor de fazê-lo além de separá-lo no ponto decimal para manter o primeiro bit. Deve haver...

Ben Shelock
fonte
21
Arredondar para zero ou para o infinito negativo?
Daniel Brückner

Respostas:

60

Arredondar para o infinito negativo - Math.floor()

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

Arredondar para zero - geralmente chamado Truncate(), mas não suportado por JavaScript - pode ser emulado usando Math.ceil()-se números negativos e Math.floor()números positivos.

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()
Daniel Brückner
fonte
Obrigado pela completude, mas a capitalização está errada ... e em java-script que faz uma enorme diferença. Caso contrário, eu teria votado aqui.
George
Atualizei a resposta para que a capitalização esteja correta agora.
chasen
18
@George ENORME ou enorme? : D
m93a 24/10/2013
1
Você pode obter o mesmo efeito que o arredondamento para zero x | 0.
Ahmed Fasih
28

Math.floor()funcionará, mas é muito lento comparado ao uso de uma ORoperação bit a bit :

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

EDIT nãoMath.floor() é mais lento do que usar o | operador. Agradeço ao Jason S por verificar meu trabalho.

Aqui está o código que eu usei para testar:

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 );
geraldalewis
fonte
11
??? Acabei de executar o jsdb (www.jsdb.org), que usa o Spidermonkey 1.7, e executei um loop para somar o valor mínimo de x [i] em uma matriz de 100000 números de ponto flutuante, primeiro com Math.floor (), depois, bit a bit ou como você sugere. Demorou aproximadamente o mesmo tempo, 125 ms.
21713 Jason S
4
Apenas repeti o teste com 500000 números de ponto flutuante, demorou aproximadamente o mesmo tempo, aproximadamente 625 ms.
21713 Jason S
5
Portanto, não vejo como 1.25usec é muito lento.
Jason S
3
Não posso argumentar com seus dados :) Acho que posso ter confundido a implementação do JS com o ActionScript (construído em EcmaScript; obviamente, a implementação difere). Obrigado por verificar meu trabalho!
Geraldalewis 27/09/09
14
Eles também não fazem a mesma coisa. |converte em um número inteiro de 32 bits, truncando; Math.floorArredonda para baixo. jsfiddle.net/minitech/UVG2w
Ry-
21

Você pode tentar usar esta função se precisar arredondar para um número específico de casas decimais

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

exemplos

alert(roundDown(999.999999)); // 999
alert(roundDown(999.999999, 3)); // 999.999
alert(roundDown(999.999999, -1)); // 990
Petr Hurtak
fonte
Eu acho que uma linha como essa não requer uma função.
Hubert Grzeskowiak
4
roundDown (4.56, 2) fornece 4.55, então não acho que seja uma boa solução.
Cryss
6

Para arredondar para o infinito negativo, use:

rounded=Math.floor(number);

Para arredondar para zero (se o número puder arredondar para um número inteiro de 32 bits entre -2147483648 e 2147483647), use:

rounded=number|0;

Para arredondar para zero (para qualquer número), use:

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

O arredondamento de um numberpara 0pode ser feito subtraindo sua parte fracionária assinada number % 1:

rounded = number - number % 1;

Como Math.floor(arredonda para -Infinity) este método é perfeitamente preciso.

Existem diferenças no manuseio e -0, no entanto:+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
Robert
fonte
3
Math.floor(1+7/8)
DigitalRoss
fonte
1 + 8/7 = 1 - Não há muito necessidade de Math.floor () há :)
Jason Berry
18
Na verdade, é (7/8) +1 que não é 1. Obrigado 3ª álgebra grau
Joe Phillips
1
Hum, por favor tente isso em um programa javascript. Eu fiz. Display (1 + 7/8) e você verá 1.875. Math.round (...) é 2, Math.floor (...) é 1. Do que vocês estão falando?
DigitalRoss
1
Ou abra o Firefox Error Console. Ou Firebug. Não é difícil tentar. Eu tentei. 1 + 7/8 é 1,875 em js. Você esqueceu que toda a matemática em js está no ponto flutuante?
DigitalRoss
3
Provavelmente é fácil esquecer que o javascript faz tudo em ponto flutuante. Em muitas outras línguas, 1 + 7/8 é 1, mas em js é realmente 1.875.
DigitalRoss
3

Estava brincando com o código de alguém hoje e encontrou o seguinte que parece arredondar para baixo também:

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

Para obter mais informações sobre o deslocamento à direita de propagação de sinal (>>), consulte Operadores de bit a bit MDN

Levei um tempo para descobrir o que estava fazendo: D

Mas, como destacado acima, Math.floor () funciona e parece mais legível na minha opinião.

Alastair Hodgson
fonte
3
Ele também mata silenciosamente seu número se não couber em 32 bits. Console do Chromium: 99999999999999999999999 | 0 => -167772160
Matthias Urlichs
0

Você precisa colocar -1 para arredondar a metade para baixo e depois multiplicar por -1, como no exemplo abaixo.

<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>
João Paulo Santarém
fonte
Honestamente Nesta comunidade, preferimos respostas como @phoebus dadas acima.
Ankit Pandey
0

Aqui está math.floor sendo usado em um exemplo simples. Isso pode ajudar um novo desenvolvedor a ter uma idéia de como usá-lo em uma função e o que ele faz. Espero que ajude!

<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>
indranatha madugalle
fonte