¿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 ...


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

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

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

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

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

3
Math.floor(1+7/8)

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.


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>

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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.