Come arrotondare un numero in JavaScript?
-
05-07-2019 - |
Domanda
Mentre stavo lavorando a un progetto, mi sono imbattuto in uno script JS creato da un ex dipendente che fondamentalmente crea un rapporto sotto forma di
Name : Value
Name2 : Value2
ecc.
Il problema è che a volte i valori possono essere float (con diversa precisione), numeri interi o persino nella forma 2.20011E + 17
. Quello che voglio produrre sono interi puri. Non conosco molto JavaScript, però. Come potrei scrivere un metodo che prende questi float a volte e li rende interi?
Soluzione
Devi convertire i tuoi input in un numero e poi arrotondarli:
function toInteger(number){
return Math.round( // round to nearest integer
Number(number) // type cast your input
);
};
O come linea unica:
function toInt(n){ return Math.round(Number(n)); };
Test con valori diversi:
toInteger(2.5); // 3
toInteger(1000); // 1000
toInteger("12345.12345"); // 12345
toInteger("2.20011E+17"); // 220011000000000000
Altri suggerimenti
Se devi arrotondare ad un certo numero di cifre usa la seguente funzione
function roundNumber(number, digits) {
var multiple = Math.pow(10, digits);
var rndedNum = Math.round(number * multiple) / multiple;
return rndedNum;
}
Secondo la specifica ECMAScript , i numeri in JavaScript sono rappresentati solo dal formato IEEE 754 a doppia precisione a 64 bit. Quindi non esiste un tipo intero in JavaScript.
Per quanto riguarda l'arrotondamento di questi numeri, ci sono molti modi per raggiungere questo obiettivo. L'oggetto Math ci offre tre metodi di arrotondamento che possiamo usare:
Il Math.round () è più comunemente usato , restituisce il valore arrotondato al numero intero più vicino. Poi c'è il Math.floor () che restituisce il più grande numero intero inferiore o uguale a un numero. Infine abbiamo la Math.ceil () che restituisce la funzione intero più piccolo maggiore o uguale a un numero.
Esiste anche il toFixed () che restituisce un stringa che rappresenta il numero usando la notazione a virgola fissa.
Ps .: Non esiste nessun secondo argomento nel metodo Math.round () . Il toFixed () non è non specifico per IE , è all'interno delle specifiche ECMAScript
Ecco un modo per poter usare Math.round ()
con un secondo argomento (numero di decimali per arrotondamento):
// 'improve' Math.round() to support a second argument
var _round = Math.round;
Math.round = function(number, decimals /* optional, default 0 */)
{
if (arguments.length == 1)
return _round(number);
var multiplier = Math.pow(10, decimals);
return _round(number * multiplier) / multiplier;
}
// examples
Math.round('123.4567', 2); // => 123.46
Math.round('123.4567'); // => 123
Puoi anche usare toFixed (x)
o toPrecision (x)
dove x è il numero di cifre.
Entrambi questi metodi sono supportati in tutti i principali browser
Puoi utilizzare Math.round () per arrotondare i numeri all'intero più vicino.
Math.round(532.24) => 532
Inoltre, puoi utilizzare parseInt () e parseFloat () per trasmettere una variabile a un certo tipo, in questo caso intero e virgola mobile.
Un'ottima approssimazione per l'arrotondamento:
function Rounding (number, precision){
var newNumber;
var sNumber = number.toString();
var increase = precision + sNumber.length - sNumber.indexOf('.') + 1;
if (number < 0)
newNumber = (number - 5 * Math.pow(10,-increase));
else
newNumber = (number + 5 * Math.pow(10,-increase));
var multiple = Math.pow(10,precision);
return Math.round(newNumber * multiple)/multiple;
}
Solo in alcuni casi quando la lunghezza della parte decimale del numero è molto lunga sarà errata.
Anche Math.floor (19.5) = 19 dovrebbe funzionare.