Les trois stockent des nombres avec un nombre fixe de chiffres, mais float et double sont binaires (IEEE 754) alors que les types décimaux travaillent en base 10. Inspectez n'importe quelle valeur avec le convertisseur de flottants IEEE 754 ; la théorie se trouve dans Comment fonctionnent les nombres à virgule flottante et Nombre à virgule flottante.
Les types côte à côte
| float (binary32) | double (binary64) | décimal (p. ex. decimal128) | |
|---|---|---|---|
| Bits au total | 32 | 64 | 128 |
| Disposition | 1 de signe, 8 d'exposant, 23 de fraction | 1 de signe, 11 d'exposant, 52 de fraction | Signe, exposant, jusqu'à 34 chiffres décimaux |
| Précision | Environ 7 chiffres décimaux | Environ 15-16 chiffres décimaux | 34 chiffres décimaux |
| Plus grande valeur finie | 3,4028235 × 10^38 | 1,7976931348623157 × 10^308 | 9,999… × 10^6144 |
| Epsilon machine | 1,19 × 10^-7 | 2,22 × 10^-16 | 10^-33 |
| Entiers exacts jusqu'à | 16 777 216 (2^24) | 9 007 199 254 740 992 (2^53) | Tous ceux de 34 chiffres au plus |
| Représente 0,1 exactement | Non | Non | Oui |
La surprise classique
- En double précision,
0.1 + 0.2donne0.30000000000000004, et lefloatle plus proche de 0,1 est0.10000000149011612. - Au-delà de 2^24, un
floatne distingue plus deux entiers voisins :16777216 + 1reste16777216. - En arithmétique décimale,
0.1 + 0.2vaut exactement0.3(decimalde Python). - Comparez les flottants avec une tolérance, jamais avec
==.
Lequel utiliser
- Graphisme, audio, apprentissage automatique et jeux : float, où la mémoire et la vitesse comptent plus que le dernier chiffre.
- Science, statistiques et code numérique général : double.
- Argent, factures, taxes et tout ce que l'on vérifie à la main : décimal (ou centimes entiers).
- Identifiants et grands compteurs : des entiers, jamais de virgule flottante.