¿Cómo puedo redondear un número en Javascript?

228

¿Cómo puedo redondear un número en JavaScript?

math.round() no funciona porque lo redondea al decimal más cercano.

No estoy seguro de si hay una mejor manera de hacerlo que no sea separarlo en el punto decimal para mantener el primer bit. Debe haber ...

Ben Shelock
fuente
21
¿Redondear hacia cero o hacia el infinito negativo?
Daniel Brückner el

Respuestas:

60

Redondear hacia el infinito negativo Math.floor()

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

Redondear hacia cero, generalmente llamado Truncate(), pero no compatible con JavaScript, se puede emular usando Math.ceil()números negativos y Math.floor()números positivos.

+3.5 => +3.0 using Math.floor()
-3.5 => -3.0 using Math.ceil()
Daniel Brückner
fuente
Gracias por lo completo, pero las mayúsculas están mal ... y en java-script eso hace una GRAN diferencia. De lo contrario, habría votado aquí.
George
He actualizado la respuesta para que la capitalización sea correcta.
chasen
18
@George ENORME o enorme? : D
m93a
1
Puede obtener el mismo efecto que la ronda a cero a través de x | 0.
Ahmed Fasih
28

Math.floor()funcionará, pero es muy lento en comparación con el uso de una ORoperación bit a bit :

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

EDITAR noMath.floor() es más lento que usar el | operador. Gracias a Jason S por revisar mi trabajo.

Aquí está el código que solía probar:

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
fuente
11
??? Acabo de ejecutar jsdb (www.jsdb.org) que usa Spidermonkey 1.7, y ejecuté un ciclo para resumir el valor del piso de x [i] en una matriz de 100000 números de coma flotante, primero con Math.floor (), luego con bit a bit o como sugieres. Tomó aproximadamente el mismo tiempo, 125 ms.
Jason S
44
Acabo de repetir la prueba con 500000 números de punto flotante, tomó aproximadamente el mismo tiempo, aproximadamente 625 ms.
Jason S
55
Entonces no veo cómo 1.25usec es muy lento.
Jason S
3
No puedo discutir con sus datos :) Creo que podría haber confundido la implementación de JS con la de ActionScript (construida en EcmaScript; obviamente, la implementación difiere). ¡Gracias por revisar mi trabajo!
geraldalewis
14
Tampoco hacen lo mismo. |se convierte en un entero de 32 bits, truncando; Math.floorRedondea hacia abajo. jsfiddle.net/minitech/UVG2w
Ry-
21

Puede intentar usar esta función si necesita redondear a un número específico de decimales

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

ejemplos

alert(roundDown(999.999999)); // 999
alert(roundDown(999.999999, 3)); // 999.999
alert(roundDown(999.999999, -1)); // 990
Petr Hurtak
fuente
Creo que una línea como esta no requiere una función.
Hubert Grzeskowiak
44
roundDown (4.56, 2) le da 4.55, así que no creo que sea una buena solución.
cryss
6

Para redondear hacia el infinito negativo, use:

rounded=Math.floor(number);

Para redondear hacia abajo hacia cero (si el número puede redondearse a un entero de 32 bits entre -2147483648 y 2147483647), use:

rounded=number|0;

Para redondear hacia cero (para cualquier número), use:

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

El redondeo de un numberhacia 0se puede hacer restando su parte fraccionada con signo number % 1:

rounded = number - number % 1;

Al igual que Math.floor(redondea hacia -Infinity) este método es perfectamente preciso.

Hay diferencias en el manejo de -0, +Infinityy -Infinityaunque:

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
fuente
3
Math.floor(1+7/8)
DigitalRoss
fuente
1 + 7/8 = 1 - No hay mucha necesidad de Math.floor () allí :)
Jason Berry
18
En realidad es (7/8) +1 que no es 1. Gracias álgebra de tercer grado
Joe Phillips
1
Umm, por favor intente esto en un programa javascript. Yo hice. Pantalla (1 + 7/8) y verá 1.875. Math.round (...) es 2, Math.floor (...) es 1. ¿De qué están hablando?
DigitalRoss
1
O abra la Consola de errores de Firefox. O Firebug. No es difícil de intentar. Lo intenté. 1 + 7/8 es 1.875 en js. ¿Posiblemente olvidaste que todas las matemáticas en js están en coma flotante?
DigitalRoss
3
Probablemente sea fácil olvidar que JavaScript hace todo en coma flotante. En muchos otros idiomas, 1 + 7/8 es 1, pero en js realmente es 1.875.
DigitalRoss
3

Estaba jugando con el código de otra persona hoy y encontré lo siguiente que parece redondeado también:

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

Para obtener más información sobre el desplazamiento a la derecha de propagación de signos (>>), consulte Operadores bit a bit de MDN

Me tomó un tiempo averiguar qué estaba haciendo esto: D

Pero como se destacó anteriormente, Math.floor () funciona y parece más legible en mi opinión.

Alastair Hodgson
fuente
3
También mata silenciosamente su número si no cabe en 32 bits. Consola de cromo: 99999999999999999999999 | 0 => -167772160
Matthias Urlichs
0

Necesitas poner -1 para redondear a la mitad y luego multiplicar por -1 como el ejemplo abajo.

<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
fuente
Honestamente En esta comunidad, preferimos respuestas como @phoebus dadas anteriormente.
Ankit Pandey
0

Aquí se usa math.floor en un ejemplo simple. Esto podría ayudar a un nuevo desarrollador a tener una idea de cómo usarlo en una función y qué hace. ¡Espero eso ayude!

<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
fuente