HOWTO · JavaScript

Arrotondare un numero a 2 cifre decimali in JavaScript

Questo tutorial insegna come arrotondare un numero al massimo a 2 cifre decimali in JavaScript?

In questa pagina

Usa toFixed(2) quando ti serve un testo che mostri sempre due cifre dopo il separatore decimale. Il metodo restituisce una stringa, quindi gli zeri finali restano visibili. Se ti serve un valore numerico, usa Math.round(value * 100) / 100 oppure converti la stringa formattata con Number(). Questi approcci sono pratici per i valori ordinari, ma JavaScript rappresenta i numeri in virgola mobile binaria: perciò valori decimali come 1.005 potrebbero non essere arrotondati come ci si aspetta.

Formattare un numero con toFixed()

Chiama toFixed(2) su un numero per ottenere una stringa con due cifre decimali. È utile per un’etichetta, una cella di tabella o un’altra visualizzazione in cui 5.60 deve mantenere lo zero finale. Il valore restituito, però, è testo: per usarlo nei calcoli devi prima riconvertirlo in numero.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

const value = 5.6789;
const fixedText = value.toFixed(2);
const roundedValue = Math.round(value * 100) / 100;
const numericValue = Number(value.toFixed(2));

function roundToTwo(number) {
  const shifted = Number(`${number}e2`);
  return Number(`${Math.round(shifted)}e-2`);
}

const shiftedValue = roundToTwo(value);
console.log(fixedText, roundedValue, numericValue, shiftedValue);
5.68 5.68 5.68 5.68

Nell’ordine, i valori sono la stringa restituita da toFixed(), il numero prodotto da Math.round(), la conversione con Number() e il risultato della funzione ausiliaria con spostamento decimale. Solo il primo valore è testo; convertendolo con Number() ottieni un numero, che non conserva gli zeri finali. Le etichette visibili nel blocco di output restano in inglese perché l’esempio è mantenuto invariato.

Arrotondare un numero con Math.round()

Moltiplicando per 100, la cifra dei centesimi passa alla posizione delle unità. Math.round() arrotonda il valore così ridimensionato a un intero; dividerlo per 100 ripristina la scala decimale. Il risultato resta un numero, comodo per i calcoli successivi, ma non specifica quante cifre decimali visualizzare.

Math.round() risolve i valori a metà arrotondando verso l’infinito positivo. Per esempio, il caso limite -1.5 viene arrotondato a -1: per i valori negativi, quindi, non si applica una regola che arrotonda sempre lontano da zero. Inoltre, la moltiplicazione stessa usa l’aritmetica in virgola mobile: è un procedimento conciso, ma non garantisce un arrotondamento decimale esatto per ogni valore.

Capire i casi limite della virgola mobile

Il tipo Number di JavaScript rappresenta i valori usando la virgola mobile binaria. Molte frazioni decimali non sono rappresentabili esattamente in binario e le operazioni intermedie possono produrre un valore appena inferiore o superiore a quello decimale desiderato. Un caso noto è 1.005: il valore memorizzato è leggermente inferiore alla frazione decimale, quindi 1.005.toFixed(2) può restituire "1.00"; anche moltiplicare prima di usare Math.round() può dare un risultato inatteso.

Number.EPSILON è la distanza tra 1 e il numero rappresentabile successivo. Aggiungerlo prima dell’arrotondamento può aiutare con alcuni valori vicini a 1, ma la distanza tra numeri rappresentabili varia con la loro grandezza. Un’aggiunta fissa di epsilon, quindi, non corregge tutti i valori né tutte le sequenze di operazioni.

toPrecision() controlla le cifre significative, non il numero di cifre dopo il separatore decimale. Per esempio, Number((1.23456).toPrecision(4)).toFixed(2) restituisce "1.24", mentre (1.23456).toFixed(2) restituisce "1.23": la prima operazione arrotonda a 1.235, poi la seconda arrotonda di nuovo quel valore intermedio. È un caso specifico di doppio arrotondamento, non una correzione generale; il primo passaggio di formattazione può eliminare informazioni necessarie a quello successivo.

Usare una funzione ausiliaria con spostamento decimale

La funzione ausiliaria qui sopra sposta la scala decimale usando la notazione esponenziale, arrotonda il valore ridimensionato e poi ripristina la scala originale. Può evitare alcune sorprese causate dal moltiplicare direttamente una frazione decimale per 100 e restituisce comunque un numero. Per arrotondare a un diverso numero di cifre decimali, adatta l’esponente: usa quel numero per lo spostamento in avanti e il suo opposto per quello di ritorno.

Considera questa funzione un’opzione pratica per valori finiti ordinari, non una libreria per l’aritmetica decimale. La rappresentazione in virgola mobile continua ad applicarsi e valori di grandezza estrema o speciali potrebbero richiedere una gestione distinta. Se per contabilità o denaro servono regole decimali esatte, usa unità minori intere quando il dominio lo consente, oppure una libreria di aritmetica decimale con regole adatte all’applicazione. Formattare un risultato per visualizzarlo ed eseguire calcoli decimali esatti sono requisiti diversi.

Scegliere l’approccio giusto

Scegli toFixed(2) se ti serve testo da visualizzare con un numero fisso di cifre: conserva gli zeri finali e restituisce una stringa. Scegli Math.round(value * 100) / 100 quando è utile ottenere un risultato numerico conciso e l’intervallo dei valori è adatto alla normale aritmetica in virgola mobile. Scegli Number(value.toFixed(2)) se vuoi applicare l’arrotondamento di toFixed() e ottenere poi un valore numerico, tenendo presente che i numeri non conservano la formattazione di visualizzazione. Puoi considerare anche la funzione ausiliaria con spostamento decimale come alternativa numerica, tenendone presenti i limiti.

Nessuno di questi metodi rende i numeri JavaScript quantità decimali esatte. Nelle interfacce, formatta il valore quando lo mostri. Per calcoli soggetti a regole decimali rigorose, definisci esplicitamente la politica di arrotondamento e la rappresentazione numerica, poi prova valori rappresentativi del dominio dell’applicazione.