Vorrei convertire un float in un numero intero in JavaScript. In realtà, vorrei sapere ENTRAMBI le conversioni standard: troncando e arrotondando. E in modo efficiente, non tramite la conversione in stringa e l'analisi.
Vorrei convertire un float in un numero intero in JavaScript. In realtà, vorrei sapere ENTRAMBI le conversioni standard: troncando e arrotondando. E in modo efficiente, non tramite la conversione in stringa e l'analisi.
Risposte:
var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue );
var intvalue = Math.round( floatvalue );
// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );
Riferimenti a oggetti matematici
// value=x // x=5 5<x<5.5 5.5<=x<6
Math.floor(value) // 5 5 5
Math.ceil(value) // 5 6 6
Math.round(value) // 5 5 6
Math.trunc(value) // 5 5 5
parseInt(value) // 5 5 5
~~value // 5 5 5
value | 0 // 5 5 5
value >> 0 // 5 5 5
value >>> 0 // 5 5 5
value - value % 1 // 5 5 5
Negativo
// value=x // x=-5 -5>x>=-5.5 -5.5>x>-6
Math.floor(value) // -5 -6 -6
Math.ceil(value) // -5 -5 -5
Math.round(value) // -5 -5 -6
Math.trunc(value) // -5 -5 -5
parseInt(value) // -5 -5 -5
value | 0 // -5 -5 -5
~~value // -5 -5 -5
value >> 0 // -5 -5 -5
value >>> 0 // 4294967291 4294967291 4294967291
value - value % 1 // -5 -5 -5
Positivo: numeri maggiori
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1
// value=x x=900719925474099 x=900719925474099.4 x=900719925474099.5
Math.floor(value) // 900719925474099 900719925474099 900719925474099
Math.ceil(value) // 900719925474099 900719925474100 900719925474100
Math.round(value) // 900719925474099 900719925474099 900719925474100
Math.trunc(value) // 900719925474099 900719925474099 900719925474099
parseInt(value) // 900719925474099 900719925474099 900719925474099
value | 0 // 858993459 858993459 858993459
~~value // 858993459 858993459 858993459
value >> 0 // 858993459 858993459 858993459
value >>> 0 // 858993459 858993459 858993459
value - value % 1 // 900719925474099 900719925474099 900719925474099
Negativo: numeri maggiori
// x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1
// value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6
Math.floor(value) // -900719925474099 -900719925474100 -900719925474100
Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099
Math.round(value) // -900719925474099 -900719925474099 -900719925474100
Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099
parseInt(value) // -900719925474099 -900719925474099 -900719925474099
value | 0 // -858993459 -858993459 -858993459
~~value // -858993459 -858993459 -858993459
value >> 0 // -858993459 -858993459 -858993459
value >>> 0 // 3435973837 3435973837 3435973837
value - value % 1 // -900719925474099 -900719925474099 -900719925474099
var intValue = ~~floatValue;
. Se la notazione è troppo oscuro per i vostri gusti, basta nasconderlo in una funzione: function toInt(value) { return ~~value; }
. (Questo converte anche le stringhe in numeri interi, se ti interessa farlo.)
Math.trunc(val);
commenta perché questa è la risposta accettata
2.3 - 2.3 % 1
È possibile utilizzare un bit per bit o un operatore per troncare le cifre in virgola mobile e funziona sia per i positivi che per i negativi:
function float2int (value) {
return value | 0;
}
risultati
float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3
Ho creato un test JSPerf che confronta le prestazioni tra:
Math.floor(val)
val | 0
bit a bit OR~~val
NON bit a bitparseInt(val)
funziona solo con numeri positivi. In questo caso sei sicuro di usare le operazioni bit a bit oltre alla Math.floor
funzione.
Ma se hai bisogno che il tuo codice funzioni con aspetti positivi e negativi , allora un'operazione bit a bit è la più veloce (O essendo quella preferita). Questo altro test JSPerf confronta lo stesso dove è abbastanza ovvio che a causa del controllo dei segni aggiuntivi Math è ora il più lento dei quattro.
Come indicato nei commenti, gli operatori BITWISE operano su numeri interi a 32 bit con segno, pertanto verranno convertiti grandi numeri, ad esempio:
1234567890 | 0 => 1234567890
12345678901 | 0 => -539222987
Math.floor()
è più veloce (almeno secondo la mia esecuzione del tuo primo test JSPerf su Google Chrome, versione 30.0.1599.101), più robusto (perché non dipende da come i numeri sono rappresentati in bit, che può cambiare e eventualmente rompere questa soluzione bit per bit) e, soprattutto, più esplicita.
~~
è meglio perché è un operatore unario. 4.2|0+4
uguale 4
ma ~~4.2+4
uguale8
Nota: non è possibile utilizzare Math.floor()
come sostituto di troncato, perché Math.floor(-3.1) = -4
e non -3
!!
Una sostituzione corretta per troncare sarebbe:
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
Math.trunc(value)
è stato aggiunto in ECMAScript 6
floor
arrotondamenti verso -infinito, truncate
arrotondamenti verso zero. ( ceil
arrotonda verso + infinito).
Un doppio operatore bit per bit non può essere utilizzato per troncare i float. Le altre operazioni che hai citato sono disponibili attraverso Math.floor
, Math.ceil
e Math.round
.
> ~~2.5
2
> ~~(-1.4)
-1
Maggiori dettagli per gentile concessione di James Padolsey.
<canvas>
motore di rendering dei caratteri in JS . Grazie!
Per troncare:
var intvalue = Math.floor(value);
Per round:
var intvalue = Math.round(value);
È possibile utilizzare il metodo parseInt per nessun arrotondamento. Prestare attenzione all'input dell'utente a causa delle opzioni del prefisso 0x (esadecimale) e 0 (ottale).
var intValue = parseInt(floatValue, 10);
parseInt(1000000000000000000000, 10);
risultato è 1, non 1 000 000 000 000 000 000 000. Comunque, la domanda esplicitamente non voleva " convertirsi in una stringa e analizzare ", anche se è relativamente minore ...;)
parseInt()
aspetta una stringa e non un numero come primo parametro. Quando si passa questo numero intero, viene convertito in 1e21
e quindi parseInt
analizza la stringa 1e21
, che risulta 1
.
Spostamento bit di 0 che equivale alla divisione per 1
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
>> 0
sembra funzionare solo per numeri interi < 2 ^ 31-1 e >>> 0
per numeri interi < 2 ^ 32-1 . Questo restituisce 0 per valori più grandi
Nel tuo caso, quando vuoi una stringa alla fine (per inserire le virgole), puoi anche semplicemente usare la Number.toFixed()
funzione, tuttavia, questo eseguirà l'arrotondamento.
Ci sono molti suggerimenti qui. L'OR bit a bit sembra di gran lunga il più semplice. Ecco un'altra breve soluzione che funziona anche con numeri negativi utilizzando l'operatore modulo. Probabilmente è più facile da capire rispetto all'OR bit a bit:
intval = floatval - floatval%1;
Questo metodo funziona anche con numeri di valore elevato in cui né '| 0' né '~~' né '>> 0' funzionano correttamente:
> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
Per troncare :
// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 ); // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted
Per arrotondare :
Math.round( 1.5 ); // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1
Un altro modo possibile: utilizzare l'operazione XOR:
console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2
La priorità delle operazioni bit per bit è inferiore alla priorità delle operazioni matematiche, è utile. Prova su https://jsfiddle.net/au51uj3r/
Se si esamina l' Math
oggetto nativo in JavaScript, si ottiene che l'intero gruppo di funzioni funzioni su numeri e valori, ecc.
Fondamentalmente quello che vuoi fare è abbastanza semplice e nativo in JavaScript ...
Immagina di avere il numero seguente:
const myValue = 56.4534931;
e ora se vuoi arrotondarlo al numero più vicino, fai semplicemente:
const rounded = Math.floor(myValue);
e ottieni:
56
Se vuoi arrotondarlo al numero più vicino, fai semplicemente:
const roundedUp = Math.ceil(myValue);
e ottieni:
57
Anche Math.round
solo arrotondarlo al numero più alto o più basso dipende da quale è più vicino al numero del flot.
Inoltre puoi usare ~~
dietro il numero float, che convertirà un float in un numero intero.
Puoi usarlo come ~~myValue
...
~~
fatto che se il numero è maggiore del limite int 32, cambierà il valore nel valore limite int 32.
//Convert a float to integer
Math.floor(5.95)
//5
Math.ceil(5.95)
//6
Math.round(5.4)
//5
Math.round(5.5)
//6
Math.trunc(5.5)
//5
//Quick Ways
console.log(5.95| 0)
console.log(~~5.95)
console.log(5.95 >> 0)
//5
Voglio solo sottolineare che monetariamente vuoi arrotondare e non troncare. Essere fuori di un centesimo è molto meno probabile, dato che 4.999452 * 100 arrotondati ti darà 5, una risposta più rappresentativa.
E soprattutto, non dimenticare l'arrotondamento del banchiere , che è un modo per contrastare il pregiudizio leggermente positivo che dà l'arrotondamento diretto - la tua applicazione finanziaria potrebbe richiederlo.
Se si utilizza angularjs, la soluzione semplice è la seguente in Binding modello HTML
{{val | number:0}}
convertirà val in numero intero
vai avanti con questo link docs.angularjs.org/api/ng/filter/number