Come posso rimuovere la parte decimale dal numero JavaScript?


218

Ho i risultati di una divisione e desidero scartare la parte decimale del numero risultante.

Come posso fare questo?

Risposte:


386

Puoi usare ...

... dipende da come si desidera rimuovere il decimale.

Math.trunc()non è ancora supportato su tutte le piattaforme (vale a dire IE), ma nel frattempo è possibile utilizzare facilmente un polyfill .

Un altro metodo per troncare la porzione frazionaria con un eccellente supporto della piattaforma consiste nell'utilizzare un operatore bit a bit (.eg |0). L'effetto collaterale dell'uso di un operatore bit a bit su un numero è che tratterà il suo operando come un intero a 32 bit con segno, quindi rimuovendo il componente frazionario. Tieni presente che questo manterrà anche numeri maggiori di 32 bit.


Potresti anche parlare dell'imprecisione dell'arrotondamento decimale con l'aritmetica in virgola mobile.

Lettura obbligatoria: ciò che ogni scienziato informatico dovrebbe sapere sull'aritmetica a virgola mobile .


29
Tenete a mente che Math.floor()vi aumentare valore numerico quando il numero è negativo . Così Math.floor(-1.2) -> -2mentre Math.floor(1.2) -> 1. parseInt(-1.2) -> -1( come indicato da @FloydPink ) eliminerà la parte decimale come previsto per i numeri positivi e negativi .
Paul T. Rawkeen,

1
@ PaulT.Rawkeen Puoi anche usare un operatore bit a bit per eliminare la parte decimale, ma tieni presente che si tronca anche a 32 bit.
alex,

2
Quanto segue mostra questa risposta instabile:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
Jake,

4
@Jake Il risultato di 2.3*100in javascript è 229.99999999999997, quindi sembra che l'operatore bit a bit stia facendo il suo lavoro correttamente nel tuo esempio.
Chad von Nau,

Esiste una soluzione simile a |0quella che utilizza numeri interi a 64 bit?
Clint,

49

È inoltre possibile utilizzare operatori bit a bit per troncare il decimale.

per esempio

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3

Le operazioni bit per bit sono notevolmente più efficienti delle funzioni matematiche. L'operatore doppio non bitwise sembra anche leggermente sovraperformare le x | 0e x << 0bitwise operazioni da una quantità trascurabile.

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}

Vale anche la pena notare che l'operatore bit per bit non ha la precedenza sulle operazioni aritmetiche, quindi potrebbe essere necessario circondare i calcoli con parentesi per ottenere il risultato desiderato:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

Ulteriori informazioni sul doppio bit a bit non sono disponibili in Double bit a bit NOT (~~)


2
Potrebbe essere marginalmente efficiente. Ma suggerirei funzioni "matematiche", in quanto più leggibili.
ashipj,

È probabile che ciò non funzioni se il numero intero non è rappresentato come numeri interi con segno a 32 bit ( stackoverflow.com/a/7488075/3655192 )
Hiroki

30

Potresti anche fare

parseInt(a/b)

17
Nota che parseIntnon funzionerà in modo affidabile per numeri grandi, perché funziona convertendo prima l'argomento in una stringa e per numeri grandi il risultato utilizzerà la notazione esponenziale. Ad esempio: var n = 22222222222222222222222; parseInt(n);restituirà 2, perché n.toString()restituisce 2.2222222222222223e+22.

2
Inoltre, non viene utilizzato parseInt()per il suo scopo, ovvero prendere un numero in una stringa e restituire a Number.
alex

22

puoi anche mostrare un certo numero di cifre dopo il punto decimale (qui 2 cifre) usando il seguente codice:

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string


4
Tenere presente che toFixed () restituisce una stringa, non un numero. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Jeanmichel Cote

1
Come è una risposta come OP che chiede di rimuovere la parte decimale
Isaac,

3
Anche se restituisce una stringa, puoi semplicemente usare il metodo Number () per correggere quel numero. (Number ((15.46974) .toFixed (2))
iPzard

13

Usa la Math.round()funzione.

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65

17
Per completezza, si tratta semplicemente di JavaScript, non di query.
Dave Newton,

1
$.round = Math.round;)
alex


6

Con ES2015, Math.trunc () è disponibile.

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN

Non è supportato in IE11 o versioni precedenti, ma funziona in Edge e in qualsiasi altro browser moderno.


2
Conoscere eventuali variazioni che consentono di troncare con X decimali? Sarebbe ingenuo pensare che Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)funzionerebbe?
Jamiebarrow,

2
Ehi Jamie, sembra che funzionerebbe nella maggior parte dei casi, ma è suscettibile ai gotcha a virgola mobile. ad es. value = 2.3e x = 2tornerà 2.29. Non ho un suggerimento migliore.
Chad von Nau,

Questa per me sembra la risposta giusta. Nessun arrotondamento superiore o inferiore. Nessun problema con numeri negativi. Basta scartare il decimale. Come la domanda posta.
Tenda Enrique Moreno,

2

Se non ti interessa il rouding, converti semplicemente il numero in una stringa, quindi rimuovi tutto dopo il periodo incluso il periodo. Funziona indipendentemente dal numero decimale.

const sEpoch = ((+new Date()) / 1000).toString();
const formattedEpoch = sEpoch.split('.')[0];

1

toFixed si comporterà come un round.

Per un comportamento simile a un piano, utilizzare%:

var num = 3.834234;
var floored_num = num - (num % 1); // floored_num will be 3

2
Perché ritieni che sia meglio dell'utilizzo di Math.floor? La tua soluzione sembra inutilmente complessa e lenta. Non so come funzioni Math.floor, ma mi aspetto che sia molto più ottimizzato. Inoltre, mi chiedo se la tua soluzione potrebbe soffrire di errori di arrotondamento in virgola mobile.
Hans Roerdinkholder,

1

Ecco la compressione nella spiegazione dettagliata con l'aiuto dei post precedenti:

1. Math.trunc (): è usato per rimuovere quelle cifre che sono seguite da un punto. Si converte implicitamente. Ma non supportato in IE.

Esempio:

Math.trunc (10.5) // 10

Math.trunc (-10.5) // -10

Altro modo alternativo: uso di bit a bit non operatore:

Esempio:

x = 5,5

~~ x // 5

2. Math.floor (): viene utilizzato per fornire il valore intero minimo possibile. È supportato in tutti i browser.

Esempio:

Math.floor (10.5) // 10

Math.floor (-10.5) // -11

3. Math.ceil (): viene utilizzato per fornire il valore intero più alto possibile. È supportato in tutti i browser.

Esempio:

Math.ceil (10.5) // 11

Math.ceil (-10.5) // -10

4. Math.round (): viene arrotondato al numero intero più vicino. È supportato in tutti i browser.

Esempio:

Math.round (10.5) // 11

Math.round (-10.5) // -10

Math.round (10.49) // 10

Math.round (-10.51) // -11


1

Per esempio:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 

o

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  

Non vedo perché questa risposta non abbia complimenti, funziona per me ed è integrata negli standard di reazione / JavaScript
cwiggo

0

Per un'implementazione ES6, utilizzare qualcosa di simile al seguente:

const millisToMinutesAndSeconds = (millis) => {
  const minutes = Math.floor(millis / 60000);
  const seconds = ((millis % 60000) / 1000).toFixed(0);
  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
}

0

Questo è per coloro che vogliono impedire agli utenti di inserire numeri decimali

<input id="myInput" onkeyup="doSomething()" type="number" />

<script>
    function doSomething() {

        var intNum = $('#myInput').val();

        if (!Number.isInteger(intNum)) {
            intNum = Math.round(intNum);
        }

        console.log(intNum);
    }
</script>

0

È possibile utilizzare .toFixed (0) per rimuovere la parte decimale completa o fornire il numero in argomenti fino al quale si desidera che il decimale venga troncato.

Nota: toFixed convertirà il numero in stringa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.