Numeri in JavaScript
JavaScript supporta vari tipi di numeri. Scopri i tipi numerici, la virgola mobile, la conversione e le insidie più comuni per programmare in modo efficace.
Introduzione ai numeri in JavaScript
JavaScript è un linguaggio dinamico e il modo in cui memorizza i numeri ha conseguenze dirette sul codice quotidiano: perché 0.1 + 0.2 non è esattamente 0.3, perché gli interi molto grandi perdono precisione e come arrotondare, formattare e analizzare i valori in modo sicuro. Questa pagina copre il tipo number ordinario, i valori speciali Infinity e NaN, le funzioni di conversione e le insidie che mettono in difficoltà la maggior parte degli sviluppatori — con esempi eseguibili che puoi modificare.
Comprensione dei tipi numerici
JavaScript ha esattamente due tipi di dati numerici:
number— il tipo di uso quotidiano. Utilizza il formato IEEE-754 a 64 bit ("virgola mobile a doppia precisione"), quindi lo stesso tipo contiene sia interi come42sia decimali come3.14. Non esiste un tipo separatointofloat.BigInt— per interi che superano il limite sicuro del tiponumber(maggiori dettagli di seguito). Un letterale BigInt termina conn, ad esempio9007199254740993n.
Puoi distinguerli con typeof:
Scrivere numeri in JavaScript
Oltre alle cifre ordinarie, JavaScript offre alcune comodità per la leggibilità:
let billion = 1e9; // scientific notation → 1000000000
let ms = 1e-6; // 0.000001 (one microsecond)
let big = 1_000_000; // underscores as visual separators (ES2021)1e9 significa "1 seguito da 9 zeri"; 1e-6 significa "sposta la virgola di 6 posizioni a sinistra." I caratteri di sottolineatura in 1_000_000 vengono ignorati dal motore — servono solo per rendere più leggibili i numeri grandi.
Numeri esadecimali, binari e ottali
JavaScript può leggere letterali in diversi sistemi numerici. Vengono tutti memorizzati come lo stesso tipo number — cambia solo la notazione:
let hex = 0xFF; // 255 (base 16, prefix 0x)
let bin = 0b1010; // 10 (base 2, prefix 0b)
let oct = 0o744; // 484 (base 8, prefix 0o)Il metodo toString
num.toString(base) converte un numero in una string in qualsiasi base da 2 a 36 — la direzione inversa rispetto ai letterali precedenti:
Nota: per chiamare un metodo direttamente su un letterale servono due punti o le parentesi — 255..toString(16) oppure (255).toString(16) — perché 255. viene letto come punto decimale.
Metodi di arrotondamento
JavaScript fornisce diverse funzioni per arrotondare i numeri:
Math.floor(): Arrotonda un numero verso il basso all'intero più vicino.
Math.ceil(): Arrotonda un numero verso l'alto all'intero più vicino.
Math.round(): Arrotonda un numero all'intero più vicino, seguendo le regole matematiche standard.
Math.trunc(): Rimuove le cifre frazionarie, troncando il numero.
La differenza tra Math.floor e Math.trunc emerge solo con i numeri negativi: Math.floor(-3.5) è -4 (arrotonda verso -Infinity), mentre Math.trunc(-3.5) è -3 (elimina semplicemente la parte frazionaria). Per ulteriori funzioni di arrotondamento e operazioni matematiche, consulta il capitolo JavaScript Math.
Formattazione dei numeri: toFixed e toPrecision
Quando hai bisogno di un numero come string con una forma fissa — denaro, percentuali, report — usa questi metodi invece di Math.round:
toFixed(digits)mantiene un numero fisso di cifre dopo la virgola.toPrecision(digits)mantiene un numero fisso di cifre significative.
Entrambi restituiscono string. Avvolgi il risultato in Number() se hai bisogno di un numero. toLocaleString() è la scelta ideale per separatori delle migliaia e valute nel locale dell'utente.
Gestione dei calcoli imprecisi
Poiché il tipo number è in virgola mobile binaria, alcune frazioni decimali non possono essere memorizzate con precisione — il famoso 0.1 + 0.2 !== 0.3. Non si tratta di un bug di JavaScript; ogni linguaggio IEEE-754 ha lo stesso comportamento.
La regola pratica: non confrontare mai i risultati in virgola mobile con ===. Arrotonda prima entrambi i lati, oppure verifica che la loro differenza sia inferiore a Number.EPSILON (il minimo intervallo tra 1 e il successivo numero rappresentabile).
Interi sicuri
Un number può memorizzare interi con precisione solo fino a Number.MAX_SAFE_INTEGER (2^53 − 1). Oltre quel limite, due interi diversi possono collassare allo stesso valore:
Se lavori con ID, timestamp in nanosecondi o contatori grandi che superano questo limite, passa a BigInt.
Valori numerici speciali
Comprensione di Infinity, -Infinity e NaN in JavaScript:
- Infinity: Rappresenta l'infinito, un valore maggiore di qualsiasi altro numero. Si ottiene dividendo un numero per zero o superando il limite superiore dei numeri in virgola mobile.
- -Infinity: Rappresenta l'infinito negativo, un valore inferiore a qualsiasi altro numero. Si verifica dividendo un numero negativo per zero o superando il limite inferiore dei numeri in virgola mobile.
- NaN: Sta per "Not-a-Number." Questo valore risulta da un'operazione indefinita o non rappresentabile matematicamente, come dividere zero per zero.
I metodi isNaN() e isFinite() per verificare questi valori speciali:
isNaN(): Controlla se un valore èNaN. Nota che il metodo globaleisNaN()esegue una coercizione implicita del tipo, quindiisNaN('hello')restituiscetrue. Per un controllo di tipo rigoroso, usaNumber.isNaN(), che restituiscetruesolo se il valore è effettivamenteNaN.isFinite(): Controlla se un valore è un numero finito, restituendofalseperInfinity,-InfinityoNaN.
Esempi:
isNaN('hello')restituiscetrueperché la string viene convertita inNaN.isFinite(2 / 0)restituiscefalse, poiché2 / 0risulta inInfinity, che non è finito.
Conversione numerica: Number(), parseInt e parseFloat
Esistono tre modi comuni per convertire una string in un numero, e scegliere quello giusto è importante.
Number(value) è rigoroso: l'intera string deve essere un numero valido (gli spazi vengono rimossi), altrimenti si ottiene NaN. Una string vuota diventa 0.
parseInt(value, radix) è permissivo: legge da sinistra e si ferma al primo carattere che non fa parte di un intero. Se il primo carattere non può essere analizzato, restituisce NaN. Passa sempre il radix (base) per evitare sorprese.
parseFloat(value) è simile a parseInt ma comprende la virgola decimale, leggendo fino a quando incontra un carattere che non fa parte di un numero in virgola mobile:
Regola pratica: usa Number() quando la string deve essere interamente numerica (ad esempio per validare l'input di un modulo) e parseInt/parseFloat quando hai bisogno di estrarre un numero da un testo come '100px'.
Conclusione
JavaScript memorizza tutti i numeri quotidiani come valori in virgola mobile a 64 bit, il che spiega le stranezze di arrotondamento, il limite degli interi sicuri e perché la formattazione e il confronto richiedono attenzione. Sapere quando usare toFixed, Number.EPSILON, BigInt o parseInt ti permette di scrivere codice con comportamento prevedibile. Continua con le guide sui tipi correlati: Stringhe, BigInt, l'oggetto Math e Tipi di dati.