Si vous écrivez 0.1 + 0.2 en JavaScript ou en Python, le résultat est 0.30000000000000004, et non 0,3. Cela se produit sur n’importe quel ordinateur, car il stocke les décimaux sous forme de fractions de dénominateur 2, 4, 8, 16… et 0,1 ne peut pas s’écrire ainsi. Le calcul avec des fractions, 1/10 + 2/10, donne bien 3/10 et ne perd rien.
Exemple résolu : la même somme avec des fractions
Additionnez 0,1 et 0,2 sans passer par le binaire.
- Écrivez chaque décimal sous forme de fraction. 0,1 = 1/10 et 0,2 = 2/10.
- Additionnez les numérateurs. Les dénominateurs sont déjà identiques : 1 + 2 = 3.
- Gardez le dénominateur. Le résultat ne peut pas être simplifié.
Résultat : 0,3, sans erreur.
Vérification : 3/10 font trois dixièmes, et 0,1 + 0,2 font aussi trois dixièmes.
Pour convertir n’importe quel décimal en fraction, utilisez l’outil décimal en fraction, qui part des chiffres que vous avez saisis.
Ce que l’ordinateur stocke réellement
Les langages de programmation utilisent presque toujours des nombres à virgule flottante en double précision (IEEE 754). Chacun est une fraction dont le dénominateur est une puissance de 2. Quand vous écrivez 0,1, le programme stocke la plus proche : 3602879701896397/2⁵⁵, qui vaut 0,1000000000000000055511151231257827… C’est un peu plus que 0,1. La documentation de Python indique que ce qui est stocké pour 0.1 est la fraction binaire 3602879701896397 / 2**55, proche de 1/10 mais pas égale.
L’écran arrondit à l’affichage, c’est pourquoi 0.1 semble correct. Si vous demandez davantage de chiffres, la différence apparaît.
| Vous écrivez | Valeur stockée | Écart avec ce qui est écrit |
|---|---|---|
| 0,1 | 0,1000000000000000055511… | +5,6 × 10⁻¹⁸ |
| 0,2 | 0,2000000000000000111022… | +1,1 × 10⁻¹⁷ |
| 0,3 | 0,2999999999999999888977… | −1,1 × 10⁻¹⁷ |
| Somme stockée de 0,1 + 0,2 | 0,3000000000000000444089… | +4,4 × 10⁻¹⁷ par rapport à 0,3 |
Le 0,2 stocké est exactement le double du 0,1 stocké, il porte donc le double de l’erreur. Lors de l’addition, le résultat est arrondi une nouvelle fois à la fraction binaire la plus proche, et ce nombre est différent de celui qui a été stocké pour 0,3. Ces deux nombres se trouvent de part et d’autre de 3/10, et c’est pourquoi la comparaison 0.1 + 0.2 == 0.3 est fausse. L’addition de l’ordinateur est correcte ; ce sont les nombres de départ qui diffèrent.
Pourquoi 1/10 ne tient pas en binaire
Une fraction irréductible a une écriture finie dans une base lorsque son dénominateur n’utilise que les facteurs premiers de cette base. En base 10, ce sont 2 et 5. En base 2, seulement 2. Le dénominateur 10 contient un 5 : en binaire, l’écriture se répète donc sans fin, 0,000110011…₂, avec le bloc 0011. C’est le même phénomène qui fait de 1/3 le nombre 0,333… en base 10, avec un autre nombre premier et une autre base. Le guide sur les fractions ayant un nombre décimal exact développe la règle en base 10, et celui sur les décimaux finis et périodiques explique comment s’écrit une période.
Pour distinguer les deux cas, regardez le dénominateur après simplification.
| Décimal | Fraction | Exact en binaire ? |
|---|---|---|
| 0,5 | 1/2 | Oui, dénominateur 2 |
| 0,125 | 1/8 | Oui, dénominateur 8 = 2³ |
| 0,625 | 5/8 | Oui, 0,101₂ |
| 0,2 | 1/5 | Non, le dénominateur 5 n’est pas une puissance de 2 |
| 0,3 | 3/10 | Non, le dénominateur 10 contient un 5 |
| 0,75 | 3/4 | Oui, dénominateur 4 |
Parmi les dixièmes, seul 0,5 est stocké sans erreur ; les quarts et les huitièmes aussi. Pour voir l’écriture décimale de n’importe quelle fraction et savoir s’il se termine ou se répète, utilisez l’outil fraction en décimal.
Que faire en pratique
Il existe trois solutions, selon votre besoin.
- Comparer : acceptez deux valeurs comme égales si leur écart est inférieur à une tolérance raisonnable pour votre problème. Python propose
math.isclose()pour cela. - Calculer avec précision : utilisez des fractions ou l’arithmétique décimale. Python inclut les modules
fractionsetdecimal; le second est conçu, selon sa documentation, pour la comptabilité et les applications exigeant une grande précision. - Afficher : n’arrondissez qu’à l’affichage. La valeur stockée ne change pas.
Pour des montants d’argent, une autre option consiste à compter en centimes avec des nombres entiers et à ne diviser par 100 qu’à l’affichage. Les entiers jusqu’à 2⁵³ sont stockés sans perte, donc chaque addition est exacte. Le choix concret dépend de chaque système.
La calculatrice de ce site suit le même principe : elle opère sur des entiers et des fractions, de sorte que 0,1 + 0,2 donne 3/10 dans la calculatrice de fractions. L’écriture décimale que vous voyez n’est qu’une présentation du résultat, et la fraction est la valeur de référence. La méthodologie explique comment les calculs sont réalisés et vérifiés.
Source : documentation de Python en français, Floating-Point Arithmetic: Issues and Limitations (consultée le 16 octobre 2026). Les valeurs du tableau ont été vérifiées par un calcul exact avec des fractions.