Mittwoch, 7. April 2010

double/float vs. decimal in C#

Vor kurzem habe ich etwas für unsere Buchhaltung programmiert. Dabei ist mir die 2er-Komplement Darstellung bzw. die Ungenauigkeit bei double bzw. float Datentypen wiedermal aufgefallen.
Normalerweise ist die Genauigkeit von float und double eh ausreichens (verbunden mit der Math.Round Funktion), aber gerade bei Berechnungen für das Finanzamt könnten solche Ungenauigkeiten fatale Auswirkungen haben, da solche Rundungsungenauigkeiten die Angewohnheit haben sich zu summieren.

Deshalb hab ich sämtliche Berechnungen mit dem decimal Datentyp gemacht. Natürlich hat auch dieser Datentyp eine begrenzte Genauigkeit, auf die ersten 28-29 signifikante Stellen (Quelle: MSDN) ist eine decimal Gleitkommazahl jedoch genau.

Das Verwenden des decimal Datentyps unterscheidet sich nur minimal vomm double Datentyp.

Eine decimal Zahl gibt man mit dem m Postfix an, zum Beispiel:

decimal d = 1.5m;
decimal d2 = d / 0.25m;

Ansonsten bietet die Decimal Klasse die selben Bequemlichkeiten wie die Double Klasse.