decimal
ist keine magische machen Sie die ganze Mathematik für mich Typ. Es ist immer noch eine Gleitkommazahl - der Hauptunterschied von float
ist, dass es eine dezimale Fließkommazahl ist, anstatt binär. So können Sie einfach 0.3
als Dezimalzahl darstellen (das ist als endliche Binärzahl unmöglich), aber Sie haben keine unendliche Genauigkeit.
Das macht es viel näher an einem Menschen, der die gleichen Berechnungen macht, aber Sie müssen sich immer noch vorstellen, dass jemand jede Operation einzeln durchführt. Es wurde speziell für Finanzberechnungen entwickelt, bei denen Sie nicht so tun, wie Sie es in Mathe tun - Sie gehen einfach Schritt für Schritt und runden jedes Ergebnis nach ziemlich spezifischen Regeln ab.
In der Tat könnte decimal
in vielen Fällen viel schlechter als float
(oder besser, double
) arbeiten. Dies liegt daran, dass decimal
keine automatische Rundung durchführt. Das Gleiche mit double
gibt 22 wie erwartet, weil automatisch angenommen wird, dass der Unterschied keine Rolle spielt - in decimal
, es tut - das ist einer der wichtigen Punkte über decimal
. Sie können dies emulieren, indem Sie manuell Math.Round
s eingeben, aber es macht nicht viel Sinn.
Sie können die [Floating-Point-Problem] (http://stackoverflow.com/questions/1584314/conversion-of-a-decimal-to-double-number-in-c-sharp-results-in-a- -unterschied) – Khatibzadeh
Related: http://stackoverflow.com/q/618535/1394393. Nicht ein Betrogener. (Zumindest greift dies auf einen Aspekt zurück, der häufig missverstanden wird.) – jpmc26