Decimal vs Double in C#: Kampf um die Genauigkeit (und Ihre Nerven)
Haben Sie jemals einen Gehaltsrechner oder, sagen wir, einen Flugball-Simulator geschrieben und plötzlich 0.30000000000000004 anstelle der erwarteten 0.3 erhalten? Wenn ja – willkommen im Club. Die Frage "decimal vs double! - Which one should I use and when?" ist eine der beliebtesten auf Stack Overflow, und das aus gutem Grund. Es scheint nur eine Wahl zwischen zwei Gleitkommazahlentypen zu sein. Aber in Wirklichkeit ist es die Wahl zwischen einer finanziellen Katastrophe und wissenschaftlicher Genauigkeit (oder umgekehrt).
In diesem Artikel werden wir diesen ewigen Streit ein für alle Mal klären. Sie erfahren, wie sich der Typ decimal in C# vom Typ double unterscheidet, wo welcher anzuwenden ist und – am wichtigsten – wie man im Jahr 2025 keine Fehler macht. Los geht's!
Kurz und knapp: Was steckt unter der Haube?
Bevor wir mit Argumenten um uns werfen, werfen wir einen Blick in die Spezifikation. Jeder Typ hat seine eigene Architektur, und genau diese bestimmt, wo er König und wo er Außenseiter ist.
Double (auch System.Double)
- Größe: 64 Bit (8 Byte).
- Genauigkeit: Ungefähr 15-17 signifikante Stellen.
- Bereich: Riesig (von ±5.0 × 10−324 bis ±1.7 × 10308).
- Darstellung: Gleitkommazahl nach IEEE 754 Standard (binär).
- Leistung: Hoch. Prozessoren sind für die Arbeit mit double optimiert.
Decimal (auch System.Decimal)
- Größe: 128 Bit (16 Byte).
- Genauigkeit: 28-29 signifikante Stellen.
- Bereich: Kleiner (von ±1.0 × 10−28 bis ±7.9 × 1028).
- Darstellung: Dezimal (im Wesentlichen eine ganze Zahl mit verschobenem Komma).
- Leistung: Niedriger. Keine Hardwareunterstützung auf der CPU, alle Berechnungen sind softwarebasiert.
Der Hauptunterschied, den Sie sich merken sollten: double ist ein binärer Bruch, während decimal ein dezimaler Bruch ist. Genau deshalb entstehen die berühmten "Rundungsfehler".
Warum "zerstört" double Geld, ist aber ideal für die Wissenschaft?
Stellen Sie sich vor, Sie versuchen, die Zahl 0.1 im Binärsystem darzustellen. Dies wird ein unendlicher periodischer Bruch: 0.0001100110011.... Der Computer schneidet ihn ab, und es entsteht ein kleiner, aber kritischer Fehler. Für wissenschaftliche Berechnungen (Wettersimulationen, Physik, Grafik) summiert sich dieser Fehler, bleibt aber innerhalb akzeptabler Grenzen. Für Finanzen bedeutet das einen "gestohlenen" Cent bei einer Million Nutzern.
Decimal hingegen speichert die Zahl als Ganzzahl (z. B. wird 1/10 = 0.1 als ganze Zahl 1 und die Information gespeichert, dass das Komma um eine Stelle verschoben werden muss). Daher ist die Genauigkeit von decimal ideal für Dezimalbrüche.
Wann sollte man decimal in C# verwenden? (Spoiler: für Geld)
Die goldene Regel, die Ihr Projekt retten wird: Verwenden Sie decimal für finanzielle, geldbezogene und buchhalterische Berechnungen. Wenn in Ihrer Variable Rubel, Dollar, Kreditzinsen oder Mehrwertsteuer liegen, ist Ihre Wahl eindeutig.
Hier ist ein Beispiel, warum double böse für den Geldbeutel ist:
using System;
public class MoneyExample{ public static void Main() { // Schlechtes Beispiel mit double double price = 10.99; double tax = 0.07; double totalDouble = price + (price * tax); Console.WriteLine($"Double total: {totalDouble}"); // Kann 11.759300000000001 ausgeben
// Gutes Beispiel mit decimal decimal priceDec = 10.99m; decimal taxDec = 0.07m; decimal totalDec = priceDec + (priceDec * taxDec); Console.WriteLine($"Decimal total: {totalDec}"); // Genau: 11.7593 }}Sehen Sie diese "zusätzliche