2009-09-16 26 views
189

¿Cómo puedo redondear un número en JavaScript?¿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 dividirlo en el punto decimal para mantener el primer bit. Debe haber ...

+19

¿Redondea hacia cero o hacia el infinito negativo? –

Respuesta

363
Math.floor() 

es la respuesta.

+2

También es el método más lento; si necesita realizar muchos de estos, use el bitwise | operador (ver mi publicación). – geraldalewis

+6

El | el operador no funcionará en números mayores que 2147483647. –

+10

| el operador también redondea hacia cero, no hacia el infinito negativo. –

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

1 + 7/8 = 1 - No hay mucha necesidad de Math.floor() allí :) –

+16

En realidad es (7/8) +1 que no es 1. Gracias álgebra de 3er grado –

+1

Umm, por favor intente esto en una programa de javascript. Yo si. Visualiza (1 + 7/8) y verás 1.875. Math.round (...) es 2, Math.floor (...) es 1. ¿De qué están hablando? – DigitalRoss

18

Math.floor() va a funcionar, pero es muy lento en comparación con el uso de un bit a bit OR operación:

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

EDITARMath.floor() es no lento que el uso del | operador. Gracias a Jason S por verificar mi trabajo.

Aquí está el código que utiliza para 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); 
+7

??? Acabo de ejecutar jsdb (www.jsdb.org) que utiliza Spidermonkey 1.7, y ejecuté un bucle para resumir el valor de piso de x [i] en una matriz de 100000 números de coma flotante, primero con Math.floor(), luego con bitwise o como sugieres. Tomó aproximadamente el mismo tiempo, 125 mseg. –

+2

Simplemente repitió la prueba con 500000 números de coma flotante, tomó aproximadamente el mismo tiempo, aproximadamente 625 mseg. –

+4

Así que no veo cómo 1.25usec es muy lento. –

55

Ronda hacia el infinito negativo - Math.floor()

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

Ronda hacia cero - generalmente llamado Truncate(), pero no es compatible con JavaScript - puede ser emulado por usando Math.ceil() para números negativos y Math.floor() para números positivos.

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

Gracias por la integridad, pero las mayúsculas están mal ... y en java-script que hace una GRAN diferencia. De lo contrario, habría votado aquí. – George

+0

He actualizado la respuesta para que las mayúsculas sean ahora correctas. – chasen

+15

@George ENORME o enorme? : D – m93a

2

estaba jugando redonda con alguien vigilara código de hoy y encontró lo siguiente que parece redondea hacia abajo, así:

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

Para obtener más información sobre el desplazamiento a la derecha propagación de inicio de sesión (>>) MDN Bitwise Operators ver

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

Pero, como se indica arriba, Math.floor() funciona y se ve más fácil de leer en mi opinión.

+1

También mata silenciosamente su número si no cabe en 32 bits. Consola Chromium: 9999999999999999999999999 | 0 => -167772160 –

16

Usted puede tratar de utilizar esta función si es necesario redondear hacia abajo a un número determinado 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 
+0

Creo que una línea como esta no requiere una función. –

+0

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, utilice:

rounded=Math.floor(number); 

Redondear hacia cero (si el número puede redondear a un número entero de 32 bits entre en -2147483648 y 2147483647), utilice:

rounded=number|0; 

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

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

Al doblar una number hacia 0 puede hacerse restando su parte fraccionaria firmado number % 1:

rounded = number - number % 1; 

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

Hay diferencias en el manejo de -0, +Infinity y -Infinity sin embargo:

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

que necesita para poner -1 a media vuelta hacia abajo y después multiplicar por -1 como el ejemplo abajo 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> 
Cuestiones relacionadas