2010-01-24 11 views
20

voglio troncare un numero in javascript, che significa tagliare via la parte decimale:JavaScript trunc() funzione

trunc (2.6) == 2

trunc (-2,6) = = -2


Dopo pesante di benchmarking la mia risposta è:

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

// or  

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

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

+5

Si noti che i metodi bit a bit (ad esempio, ~~ n o n | 0) funzionano solo sui numeri fino a 2^31-1 o 2147483647. 2147483648 o superiore restituiranno un risultato errato; ad esempio, 2147483647 | 0 restituisce -2147483648 e 4294967295 | 0 restituisce -1, che non è quasi sicuramente quello che desideri –

risposta

34

In aggiunta alla risposta 's il @Daniel, se si desidera troncare sempre verso lo zero, è possibile:

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

Oppure:

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

Entrambi vi darà i risultati giusti per entrambi, numeri positivi e negativi:

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

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

13

Per i numeri positivi:

Math.floor(2.6) == 2; 

Per i numeri negativi:

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

È possibile utilizzare toFixed metodo che permette anche di specificare il numero di numeri decimali che si desidera visualizzare:

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 

Basta notare che toFixed arrotonda il numero:

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

Arrotondamento significa che non è troncato. Si noti inoltre che toFixed restituisce una stringa –

4

Io uso

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

perché funziona su tutta la gamma galleggiante e dovrebbe (non misurato) essere più veloce di

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

brillante! La tua strada è solo leggermente più veloce, ma è molto più compatta, il che ha anche un effetto sulle prestazioni. Ancora meglio, non devo usare una chiamata di funzione, posso solo incorporare (n - n% 1) in linea! Sto usando (n | 0), ma funziona solo correttamente per i numeri inferiori a 32 bit invece dell'intervallo di virgola mobile a 64 bit. Lo userò d'ora in poi, grazie! –