Souba SOUBA

Pourquoi 0,1 + 0,2 ne fait pas 0,3

Dans presque tous les langages, 0,1 + 0,2 donne 0.30000000000000004. Ce n'est pas un bug : c'est une limite du binaire, comme 1/3 en décimal.

55s · 22 juillet 2026 · 2 min de lecture

Pourquoi 0,1 + 0,2 ne fait pas 0,3

En bref

Les ordinateurs stockent les nombres à virgule au format IEEE 754, en binaire. Or 0,1 et 0,2 n'ont pas d'écriture binaire exacte — comme 1/3 n'a pas d'écriture décimale finie. La machine arrondit, les erreurs minuscules s'additionnent, et 0,1 + 0,2 donne 0.30000000000000004. Conséquence : on ne compare jamais deux flottants avec une égalité stricte.

Le résultat qui surprend

Tape 0,1 + 0,2 dans Python, JavaScript, Java ou C : tu n'obtiens pas 0,3, mais 0.30000000000000004. Le même résultat partout, parce que ces langages suivent tous la même norme : IEEE 754, le format binaire des nombres à virgule. Ce n'est pas un bug — c'est le comportement attendu.

Le vrai coupable : le binaire

En décimal, un tiers s'écrit 0,333… à l'infini : impossible à noter exactement avec un nombre fini de chiffres. En binaire, c'est 0,1 qui pose ce problème — son écriture commence par 0,00011001100110011… et ne s'arrête jamais. Comme la machine n'a qu'un nombre fini de bits (64 en double précision), elle arrondit. 0,1 et 0,2 sont donc déjà légèrement faux avant même l'addition ; en les ajoutant, les écarts se combinent.

python
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.2 == 0.3
False
>>> abs(0.1 + 0.2 - 0.3) < 1e-9   # comparaison avec une marge
True
Le test d'égalité stricte échoue ; la comparaison avec une marge fonctionne.

Comment l'éviter

La parade dépend du besoin. Pour comparer, on teste si l'écart est plus petit qu'une petite marge (un « epsilon »), jamais avec un égal strict. Pour l'argent, on ne stocke pas des euros à virgule : on compte en centimes, en nombres entiers. Et pour des calculs décimaux exacts, on utilise un type dédié — le module decimal en Python, BigDecimal en Java.

Le réflexe faux

  • a == b sur des flottants
  • Stocker l'argent en virgule

Le bon

  • Comparer avec une marge (epsilon)
  • Compter en centimes ou en décimal exact

→ Le flottant est rapide et approché : on l'utilise en connaissance de cause.

À retenir

  • Dans presque tous les langages, 0,1 + 0,2 vaut 0.30000000000000004 (norme IEEE 754).
  • 0,1 n'a pas d'écriture binaire finie — comme 1/3 en décimal — donc la machine arrondit.
  • Les arrondis de 0,1 et 0,2 se combinent à l'addition : le résultat tombe à côté de 0,3.
  • Règle : jamais d'égalité stricte sur des flottants ; utiliser une marge, des centimes, ou un type décimal.

Sources · la preuve

  1. [01] Floating Point Arithmetic: Issues and Limitations Python · docs.python.org Doc officielle : 0,1 inexprimable en binaire, arrondi et comportement IEEE 754.
  2. [02] The IEEE 754 Format Emory University (CS170) · mathcenter.oxford.emory.edu Structure signe / exposant / mantisse ; arrondi à un nombre fini de bits.
  3. [03] Why 0.1 + 0.2 != 0.3: A Deep Dive into IEEE 754 larrylu.dev · larrylu.dev Ce n'est pas un bug ; double précision (52 bits de fraction) ; epsilon et module decimal.
  4. [04] Why 0.1 + 0.2 Doesn't Equal 0.3 in Programming Built In · builtin.com Résultat 0.30000000000000004 ; stockage en double précision sur 64 bits.
flottantieee 754binaireprécisionprogrammation

Aussi dans Shorts