IMPARA AL TUO RITMO

Perché 0,1 + 0,2 non fa 0,3 sul computer

Pubblicato il

Perché 0,1 + 0,2 non fa 0,3 sul computer: perché i decimali sono memorizzati in binario e 1/10 non ha una scrittura binaria finita. Il computer conserva un’approssimazione di 0,1 e una di 0,2, e la loro somma appare come 0,30000000000000004. La somma matematica esatta è 1/10 + 2/10 = 3/10, come conferma lo strumento decimale in frazione.

L’essenziale

La stessa regola in base 10 e in base 2

Il risultato strano non è un difetto del computer: è la conseguenza di scrivere un numero razionale in una base che non lo favorisce. La regola è la stessa usata con i decimali in base 10, applicata alla base 2.

In base 10, una frazione ridotta dà un decimale esatto se il suo denominatore ha solo i fattori primi 2 e 5. Se compare un altro fattore primo, il decimale è periodico. Per questo 1/3 = 0,333… non termina mai: il denominatore 3 non può far parte di una potenza di dieci. Il criterio è spiegato in dettaglio nella guida sulle frazioni decimali finiti.

In base 2 accade la stessa cosa, ma la base è il numero 2, non 10. Un decimale termina se il suo denominatore ridotto è una potenza di 2. Il denominatore 10 = 2 × 5 contiene il fattore primo 5, che non entra in nessuna potenza di due. Per questo 1/10 = 0,0001100110011…₂ si ripete senza fine. Il blocco che si ripete è 0011, e la sua periodicità vale 4. La differenza tra decimale finito e periodico, con altri esempi, è esposta in decimali finiti e periodici.

La stessa idea in due basi: in base 10 si ripete 1/3, in base 2 si ripete 1/10, perché il suo denominatore contiene un fattore primo che la base non ammette.

1/3 = 0,333… (base 10); 1/10 = 0,000110011…₂ (base 2)

La simmetria è esatta. In base 10, il denominatore 3 impedisce al decimale di terminare; in base 2, il denominatore 5 impedisce alla scrittura di terminare. Il fattore primo che avanza rispetto alla base è il responsabile, e il denominatore è ciò che decide.

Il ruolo dei fattori primi

Una frazione ridotta ha una scrittura finita in una base b esattamente quando il suo denominatore divide una potenza di b. Dividere una potenza di b si può fare solo con i fattori primi di b. In base 10, i fattori primi di 10 sono 2 e 5; in base 2, l’unico fattore primo è 2.

Si verifica con una moltiplicazione. Un decimale finito di n cifre in base 2 vale un intero diviso per 2ⁿ. Per esempio, 0,101₂ = 101₂/2³ = 5/8, e 5/8 ha bisogno solo del fattore 2. Se il denominatore ridotto è una potenza di 2, moltiplicare numeratore e denominatore per le potenze mancanti lo porta a una potenza di 2. Se resta un altro fattore primo, come il 5 di 1/10, nessuna potenza di 2 lo contiene.

Il criterio dipende dal denominatore della frazione irriducibile, non dal numeratore né dalla scrittura iniziale. Per passare da un decimale alla sua frazione esatta si usa lo strumento decimale in frazione, che conserva le cifre scritte e non interpreta un’approssimazione di macchina. Una frazione come 1/10 è un numero razionale perfettamente esatto; ciò che non è esatto è la sua scrittura in base 2. Il valore di ogni posizione decimale, decimi e centesimi, è ripreso in frazioni decimali.

Come si memorizza davvero 0,1

Quando si scrive 0,1 in un programma, il linguaggio lo converte quasi sempre nel formato IEEE 754 a doppia precisione, chiamato binary64. Quel formato usa 64 bit e dispone solo di 53 bit di precisione per la mantissa, quindi non può memorizzare la scrittura infinita di 1/10. Memorizza il valore rappresentabile più vicino.

Questo valore più vicino è esattamente la frazione 3602879701896397/36028797018963968. Poiché 36028797018963968 = 2⁵⁵, il denominatore è una potenza di 2, come richiede il formato. Il numeratore è dispari e leggermente maggiore di un decimo del denominatore, quindi il numero memorizzato sta un po’ sopra 0,1.

La differenza rispetto a 1/10 vale 1/180143985094819840, un valore dell’ordine di 5,6 × 10⁻¹⁸. È un minuscolo errore di approssimazione, invisibile con poche cifre, ma reale. La frazione esatta 1/10 non viene memorizzata; viene memorizzato il suo miglior vicino binario.

Perché 0,1 + 0,2 non fa 0,3?

Ogni operando viene convertito prima dell’operazione: sia 0,1 sia 0,2 sono memorizzati come frazioni binarie vicine al valore decimale ma non uguali. Sommando i due valori memorizzati, i piccoli errori si accumulano e il risultato si allontana da 3/10 abbastanza da mostrare una cifra finale inattesa.

In pratica, scrivere 0.1 + 0.2 in JavaScript o in Python stampa 0.30000000000000004. Quel testo è il decimale più corto che identifica in modo univoco il numero binario memorizzato; non significa che il risultato abbia 17 cifre significative proprie. La quantità realmente memorizzata sta da un lato di 3/10, e il programma la riproduce fedelmente.

L’errore del risultato (≈ 4,4 × 10⁻¹⁷) è maggiore di quello di ciascun operando (≈ 5,6 × 10⁻¹⁸ e ≈ 1,1 × 10⁻¹⁷), perché ci sono due arrotondamenti precedenti e uno finale. Non serve imparare a memoria la dimensione esatta dello scarto: serve capire che il binario non può rappresentare 1/10 né 2/10, e che l’errore della somma combina entrambi.

Due modi di scrivere la stessa somma: quello della macchina, che accumula l'errore di ogni decimale binario, e quello esatto, che conserva il valore razionale.
✗ Approssimato0,1 + 0,2 = 0,30000000000000004Somma di due approssimazioni binarie
✓ Esatto1/10 + 2/10 = 3/10Frazioni esatte, denominatore comune 10

1/10 + 2/10 = 3/10; la macchina stampa 0,30000000000000004

Quali decimali sono esatti in binario?

Sono esatti in binario i decimali il cui denominatore ridotto è una potenza di 2. I casi più semplici sono 1/2 = 0,1₂, 3/8 = 0,011₂ e 5/16 = 0,0101₂. Ognuno corrisponde a metà, ottavi e sedicesimi, e nessuno ha bisogno del fattore 5.

La verifica è la stessa divisione lunga usata con i decimali in base 10. Dividendo 3 per 8 in base 2, i resti arrivano a zero e la scrittura si ferma. In 1/10, al contrario, i resti tornano a comparire e la scrittura non si esaurisce, come mostra la divisione seguente.

Un’eredità utile di questa regola compare quando i computer trattano misure già espresse in metà o potenze di due. Ma attenzione all’intuizione opposta: che un decimale termini sullo schermo non garantisce che termini in binario. Viceversa invece è vero: ciò che termina in binario termina anche in base 10, perché il suo denominatore ha solo il fattore 2.

La divisione binaria di 1/10 passo per passo

La divisione lunga in base 2 mostra perché il blocco 0011 si ripete. Si moltiplica il resto per 2 e si annota una cifra; quando un resto ricompare, anche la sequenza di cifre si ripete.

Divisione lunga di 1/10 in base 2: i resti non arrivano a zero e tornano allo stesso punto, quindi il blocco 0011 si ripete all'infinito.
Moltiplica il resto per 21 × 2 = 2; 2 < 10 → cifra 0
Prosegui la divisioneresto 2: 2 × 2 = 4 → 0; 4 × 2 = 8 → 0; 8 × 2 = 16 → 1 (resto 6); 6 × 2 = 12 → 1 (resto 2)
Compare il blocco⋯ 0 0 0 1 1 0 0 1 1 ⋯
Il periodo si ripete1/10 = 0,000110011…₂

In parole semplici: si prende il resto 1, si raddoppia e si confronta con 10. Finché il risultato è minore di 10, la cifra è 0. Arrivati a 16 compare il primo 1, perché 16 ÷ 10 lascia quoziente 1. Dopo aver prodotto alcune cifre, un resto uguale a uno precedente rende identici i passi successivi. Quel ritorno è il segno della periodicità, esattamente come nella divisione di 1 per 3 in base 10.

Qui la stessa divisione sotto forma di tabella. Le cifre mostrano lo schema e i resti indicano quando ricomincia.

Resto iniziale ×2 Cifra binaria Resto nuovo
1 2 0 2
2 4 0 4
4 8 0 8
8 16 1 6
6 12 1 2
2 4 0 4

Il resto nuovo 2 era già comparso nella seconda riga. Da lì la lista ripercorre 4, 8, 6, 2 e le cifre 0, 0, 1, 1 si ripetono all’infinito. La riga che si ripete contiene quattro cifre: 0, 0, 1, 1. Questo è il periodo.

Confrontare con tolleranza e lavorare in centesimi

Il primo problema pratico compare nel confrontare risultati che dovrebbero essere uguali. Se un programma calcola 0,1 + 0,2 e lo confronta con 0,3 con un’uguaglianza stretta, il confronto può fallire perché i due numeri binari non sono lo stesso. La pratica comune è confrontare con una tolleranza: accettare come uguali due valori la cui differenza assoluta è minore di una soglia piccola e adatta al problema.

La tolleranza va scelta con criterio. Una soglia troppo grande dichiara uguali valori che non lo sono; una troppo piccola lascia passare gli errori accumulati. La soglia non è una proprietà universale: dipende da quante operazioni sono state eseguite e dalla grandezza dei numeri. Il confronto con tolleranza è una convenzione di calcolo, non una prova di uguaglianza esatta.

Il secondo problema pratico è il denaro. Memorizzare prezzi e saldi in euro con decimali binari introduce gli stessi scarti, che si sommano ripetendo le operazioni. Una pratica diffusa è lavorare in centesimi: moltiplicare per 100 e operare con numeri interi. I numeri interi si memorizzano senza perdita, quindi ogni somma di centesimi è esatta. Alla fine si divide per 100 solo per mostrare l’importo. È un modo di descrivere l’aritmetica, e la decisione concreta dipende dal sistema.

Aiuta anche ricordare che l’errore binario di ogni operazione è molto piccolo: in doppia precisione, al massimo ≈ 1,1 × 10⁻¹⁶ in valore relativo. La difficoltà nasce quando gli errori si accumulano in cicli lunghi o quando si confrontano valori con uguaglianza esatta.

Test rapido: riconosci il decimale esatto

Prima di proseguire, un esercizio per fissare la regola.

  1. 1/8 termina in base 2? Sì: 8 = 2³ è una potenza di 2, quindi 1/8 = 0,001₂ termina.
  2. 3/5 termina in base 2? No: 5 è un fattore primo che non è 2, quindi la sua scrittura binaria è periodica.
  3. 7/10 termina in base 10? Sì: il denominatore ridotto 10 = 2 × 5 ha solo i fattori 2 e 5, quindi 7/10 = 0,7 termina.

La stessa domanda, due basi diverse. Basta fattorizzare il denominatore della frazione irriducibile e confrontare i suoi fattori primi con quelli della base.

Come la calcolatrice evita questo errore

La calcolatrice di questo sito non memorizza i decimali come numeri binari approssimati. Come descrive la metodologia di calcolo, le operazioni razionali usano interi a precisione arbitraria nel browser. Ogni frazione viene normalizzata: il denominatore resta positivo, e numeratore e denominatore sono ridotti per il loro massimo comune divisore.

Poiché il calcolo avviene con interi e frazioni, 1/10 + 2/10 si risolve come 3/10 senza passare per un’approssimazione binaria. La frazione normalizzata è esatta. Quando lo strumento mostra anche una cifra decimale, quella cifra è una presentazione approssimata ed è segnalata come tale; la frazione esatta viene conservata.

Conviene separare due cose che suonano simili. Un’approssimazione è una scrittura decimale vicina al valore senza uguagliarlo, come 0,333. Un risultato esatto è la frazione irriducibile, come 1/3, che rappresenta il numero senza perdita. L’errore di approssimazione appartiene alla scrittura, non al numero razionale.

Per passare da una frazione al suo decimale, con la classificazione tra esatto e periodico, c’è lo strumento frazione in decimale. Per il percorso inverso, decimale in frazione ricostruisce la frazione esatta dalle cifre.

Posso fidarmi di un risultato decimale della macchina?

Sì, entro i suoi limiti. Un decimale di macchina a doppia precisione è corretto su circa quindici cifre significative, sufficienti per quasi ogni misura fisica comune. Il problema non è che il risultato sia inutile, ma che non può essere trattato come un’uguaglianza esatta tra razionali.

Per decidere se un decimale è affidabile, guarda tre cose. Prima, quante operazioni si sono accumulate: ognuna aggiunge un piccolo arrotondamento. Seconda, se confronti con uguaglianza stretta o con tolleranza. Terza, se il valore dovrebbe essere un razionale semplice, come 3/10, nel qual caso la frazione esatta è il riferimento.

Quando il valore deve essere esatto — per esempio nel verificare un’uguaglianza tra frazioni — opera con frazioni o interi e riserva il decimale alla presentazione. Il decimale arrotondato serve a leggere e misurare; la frazione serve a dimostrare.

Domande frequenti

Ha torto il computer o è sbagliata la somma?

Nessuno dei due. La somma in binario è corretta entro il formato che il computer usa. Ciò che accade è che 1/10 non ha una scrittura binaria finita, quindi gli operandi erano già arrotondati. Nemmeno il decimale 0,3 è rappresentabile esattamente in quel formato.

Perché 1/3 non termina in base 10?

Perché il suo denominatore ridotto, 3, non divide nessuna potenza di 10. Il dieci ha solo i fattori primi 2 e 5, e il 3 non divide nessuna potenza di 10. Per questo la divisione di 1 per 3 lascia resti che si ripetono e la cifra 3 prosegue senza fine.

Quale frazione esatta si memorizza scrivendo 0,1?

Nel formato binario a doppia precisione il valore memorizzato è esattamente 3602879701896397/36028797018963968. Il denominatore è 2⁵⁵, una potenza di 2, come richiede il formato. Questa frazione è un po’ maggiore di 1/10; l’errore è dell’ordine di 5,6 × 10⁻¹⁸.

Come confronto due decimali che dovrebbero essere uguali?

Confrontali con una tolleranza: accetta che siano uguali se la differenza assoluta è minore di una soglia piccola. La soglia si sceglie in base al problema, perché cresce con il numero di operazioni e con la grandezza dei valori. Per un’uguaglianza esatta, confronta le frazioni.

Questo significa che l’aritmetica decimale è falsa?

No. I numeri razionali che quei decimali rappresentano sono esatti; ciò che è approssimato è la loro scrittura in una base che non li favorisce. Uno stesso numero può avere scrittura finita in base 10 e periodica in base 2, e resta lo stesso numero razionale. La scelta della base cambia la scrittura, non il valore.

Conclusione

Il motivo per cui 0,1 + 0,2 non fa 0,3 sul computer è che i decimali sono memorizzati in binario, e 1/10 non ha una scrittura binaria finita perché il suo denominatore contiene il fattore primo 5. Il computer memorizza approssimazioni, le somma e mostra 0,30000000000000004. La somma esatta, 1/10 + 2/10 = 3/10, si conserva quando si lavora con frazioni e interi, come fa la calcolatrice di frazioni. Capire il criterio dei fattori primi permette di distinguere un risultato esatto da un’approssimazione e di scegliere la forma adatta a ogni compito.

Passo successivo

Convertire un numero decimale in frazione Trasforma un decimale limitato in frazione ridotta: scrivi le cifre su 10, 100, 1000… e dividi per il MCD.
Segnala un erroreCome gestiamo le correzioni

Usa la calcolatrice di frazioni

LA TUA CALCOLATRICE A PORTATA DI MANO

Salva la calcolatrice

Apri il menu del browser e scegli «Installa app» o «Aggiungi alla schermata Home». Puoi anche salvare questa pagina tra i preferiti.