2010-01-24 19 views
20

quiero truncar un número en JavaScript, que significa para cortar la parte decimal:javascript trunc() función

trunc (2.6) == 2

trunc (-2,6) = = -2


Después de fuertes evaluación comparativa mi respuesta es:

function trunc (n) { 
    return ~~n; 
} 

// or  

function trunc1 (n) { 
    return n | 0; 
 } 
+0

http://jsperf.com/truncate-0 – Dan

+5

Tenga en cuenta que a nivel de bits métodos (p. ej., ~~ n o n | 0) solo funciona en números hasta 2^31-1 o 2147483647. 2147483648 o superior devolverá un resultado incorrecto; por ejemplo, 2147483647 | 0 devuelve -2147483648, y 4294967295 | 0 devuelve -1, que casi definitivamente no es lo que quiere –

Respuesta

34

Como complemento a la respuesta del @Daniel 's, si desea truncar siempre hacia cero, se puede:

function truncate(n) { 
    return n | 0; // bitwise operators convert operands to 32-bit integers 
} 

O:

function truncate(n) { 
    return Math[n > 0 ? "floor" : "ceil"](n); 
} 

Tanto le dará los resultados correctos para ambos, los números positivos y negativos:

truncate(-3.25) == -3; 
truncate(3.25) == 3; 
+0

http://jsperf.com/javascript-trunc – Dan

13

Para números positivos:

Math.floor(2.6) == 2; 

Para los números negativos:

Math.ceil(-2.6) == -2; 
10

Puede utilizar toFixed método que también permite especificar el número de decimales que desea mostrar:

var num1 = new Number(3.141592); 
var num2 = num1.toFixed(); // 3 
var num3 = num1.toFixed(2); // 3.14 
var num4 = num1.toFixed(10); // 3.1415920000 

Ten en cuenta que toFixed rondas el número:

var num1 = new Number(3.641592); 
var num2 = num1.toFixed(); // 4 
+1

Redondeo significa que no está truncando. También tenga en cuenta que toFixed devuelve una cadena –

4

utilizo

function trunc(n){ 
    return n - n % 1; 
} 

, ya que funciona en todo el rango de flotación y debe (no medidos) ser más rápido que

function trunc(n) { 
    return Math[n > 0 ? "floor" : "ceil"](n); 
} 
+0

Brilliant! Su camino es solo un poco más rápido, pero es mucho más compacto, lo que también tiene un efecto en el rendimiento. Aún mejor, no tengo que usar una llamada a función, ¡solo puedo insertar (n - n% 1) en línea! He estado usando (n | 0), pero eso solo funciona correctamente para números por debajo de los tamaños de 32 bits en lugar del rango de punto flotante completo de 64 bits. Voy a usar esto a partir de ahora, gracias! –