W3docs

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 come 42 sia decimali come 3.14. Non esiste un tipo separato int o float.
  • BigInt — per interi che superano il limite sicuro del tipo number (maggiori dettagli di seguito). Un letterale BigInt termina con n, ad esempio 9007199254740993n.

Puoi distinguerli con typeof:

javascript— editable

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:

javascript— editable

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:

  1. Math.floor(): Arrotonda un numero verso il basso all'intero più vicino.
javascript— editable
  1. Math.ceil(): Arrotonda un numero verso l'alto all'intero più vicino.
javascript— editable
  1. Math.round(): Arrotonda un numero all'intero più vicino, seguendo le regole matematiche standard.
javascript— editable
  1. Math.trunc(): Rimuove le cifre frazionarie, troncando il numero.
javascript— editable

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.
javascript— editable

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.

javascript— editable

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:

javascript— editable

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 globale isNaN() esegue una coercizione implicita del tipo, quindi isNaN('hello') restituisce true. Per un controllo di tipo rigoroso, usa Number.isNaN(), che restituisce true solo se il valore è effettivamente NaN.
  • isFinite(): Controlla se un valore è un numero finito, restituendo false per Infinity, -Infinity o NaN.

Esempi:

  • isNaN('hello') restituisce true perché la string viene convertita in NaN.
  • isFinite(2 / 0) restituisce false, poiché 2 / 0 risulta in Infinity, 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.

javascript— editable

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.

javascript— editable

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:

javascript— editable

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.

Esercitazione

Pratica
Cosa è vero riguardo ai numeri in JavaScript?
Cosa è vero riguardo ai numeri in JavaScript?
Was this page helpful?