Decimal vs Double en C# : La bataille pour la précision (et vos nerfs)
\n\nAvez-vous déjà écrit un calculateur de salaire ou, disons, un simulateur de vol de balle, et soudainement obtenu 0.30000000000000004 au lieu des 0.3 attendus ? Si oui — bienvenue au club. La question "decimal vs double ! - Which one should I use and when?" est l'une des plus populaires sur Stack Overflow, et pour cause. Il semble que ce soit simplement un choix entre deux types de nombres à virgule flottante. Mais en réalité, c'est un choix entre une catastrophe financière et une précision scientifique (ou l'inverse).
Dans cet article, nous allons trancher ce débat éternel une fois pour toutes. Vous apprendrez en quoi le type decimal en C# diffère du type double, où les appliquer et, surtout, — comment ne pas faire d'erreur en 2025. C'est parti !
\n\nL'essentiel en bref : que se cache-t-il sous le capot ?
\n\nAvant de commencer à échanger des arguments, jetons un coup d'œil aux spécifications. Chaque type a sa propre architecture, et c'est elle qui détermine où il sera roi et où il sera paria.
\n\nDouble (alias System.Double)
\n- \n
- Taille : 64 bits (8 octets). \n
- Précision : Environ 15 à 17 chiffres significatifs. \n
- Plage : Énorme (de ±5,0 × 10−324 à ±1,7 × 10308). \n
- Représentation : Virgule flottante selon la norme IEEE 754 (binaire). \n
- Performance : Élevée. Les processeurs sont optimisés pour travailler avec double. \n
Decimal (alias System.Decimal)
\n- \n
- Taille : 128 bits (16 octets). \n
- Précision : 28 à 29 chiffres significatifs. \n
- Plage : Plus petite (de ±1,0 × 10−28 à ±7,9 × 1028). \n
- Représentation : Décimale (en substance, un nombre entier avec décalage de virgule). \n
- Performance : Inférieure. Pas de support matériel sur le CPU, tous les calculs sont logiciels. \n
La principale différence à retenir : double est une fraction binaire, tandis que decimal est une fraction décimale. C'est précisément pour cela que les fameuses "erreurs d'arrondi" apparaissent.
\n\nPourquoi double "casse" l'argent, mais est idéal pour la science ?
\n\nImaginez que vous essayez d'écrire le nombre 0.1 en système binaire. Ce sera une fraction périodique infinie : 0.0001100110011.... L'ordinateur la tronque, et il en résulte une petite erreur, mais critique. Pour les calculs scientifiques (simulations météorologiques, physique, graphisme), cette erreur s'accumule, mais reste dans des limites acceptables. Pour la finance, c'est un "centime volé" à un million d'utilisateurs.
Decimal, quant à lui, stocke le nombre comme un entier (par exemple, 1/10 = 0.1 est stocké comme l'entier 1 et l'information que la virgule doit être décalée d'un chiffre). Ainsi, la précision de decimal est idéale pour les fractions décimales.
\n\nQuand utiliser decimal en C# ? (Indice : pour l'argent)
\n\nLa règle d'or qui sauvera votre projet : utilisez decimal pour les calculs financiers, monétaires et comptables. Si votre variable contient des euros, des dollars, des pourcentages de prêt ou de la TVA — votre choix est sans équivoque.
\n\nVoici un exemple montrant pourquoi double est un fléau pour le porte-monnaie :
\n\nusing System;\n\npublic class MoneyExample\n{\n public static void Main()\n {\n // Mauvais exemple avec double\n double price = 10.99;\n double tax = 0.07;\n double totalDouble = price + (price * tax);\n Console.WriteLine($"Double total: {totalDouble}"); // Peut afficher 11.759300000000001\n\n // Bon exemple avec decimal\n decimal priceDec = 10.99m;\n decimal taxDec = 0.07m;\n decimal totalDec = priceDec + (priceDec * taxDec);\n Console.WriteLine($"Decimal total: {totalDec}"); // Exactement : 11.7593\n }\n}\n\nVous voyez ce "chiffre en trop