Ho i risultati di una divisione e desidero scartare la parte decimale del numero risultante.
Come posso fare questo?
Ho i risultati di una divisione e desidero scartare la parte decimale del numero risultante.
Come posso fare questo?
Risposte:
Puoi usare ...
Math.trunc() (tronca la parte frazionaria, vedi anche sotto)Math.floor() (arrotondato per difetto)Math.ceil() (arrotondare) Math.round() (arrotondato al numero intero più vicino)... 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.
> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
2.3*100in javascript è 229.99999999999997, quindi sembra che l'operatore bit a bit stia facendo il suo lavoro correttamente nel tuo esempio.
|0quella che utilizza numeri interi a 64 bit?
È 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 (~~)
Potresti anche fare
parseInt(a/b)
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.
parseInt()per il suo scopo, ovvero prendere un numero in una stringa e restituire a Number.
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
Usa la Math.round()funzione.
Math.round(65.98) // will return 66
Math.round(65.28) // will return 65
$.round = Math.round;)
Uso Math.round() .
(La risposta di Alex è migliore; ho fatto un'ipotesi :)
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.
Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x)funzionerebbe?
value = 2.3e x = 2tornerà 2.29. Non ho un suggerimento migliore.
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
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
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
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>
È 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.
Math.floor()vi aumentare valore numerico quando il numero è negativo . CosìMath.floor(-1.2) -> -2mentreMath.floor(1.2) -> 1.parseInt(-1.2) -> -1( come indicato da @FloydPink ) eliminerà la parte decimale come previsto per i numeri positivi e negativi .