Antworten:
Sie verwenden das nur M
für ein numerisches Literal, wenn Sie es umsetzen, ist es nur:
decimal dtot = (decimal)doubleTotal;
Beachten Sie, dass eine Gleitkommazahl nicht dazu geeignet ist, einen genauen Wert beizubehalten. Wenn Sie also zuerst Zahlen addieren und dann in konvertieren, Decimal
können Rundungsfehler auftreten. Möglicherweise möchten Sie die Zahlen konvertieren, Decimal
bevor Sie sie addieren, oder sicherstellen, dass die Zahlen überhaupt keine Gleitkommazahlen sind.
Sie können ein Double in eine solche Dezimalzahl umwandeln, ohne das M
Literal-Suffix zu benötigen :
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
Sie sollten Folgendes verwenden, M
wenn Sie einen neuen wörtlichen Dezimalwert deklarieren:
decimal dec = 123.45M;
(Ohne das M
wird 123.45 als Double behandelt und nicht kompiliert.)
Standardkonvertierungsklasse verwenden: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
double
bis zuzulassen decimal
, da dies für einen double
Wert wie (1000000.0 / 3.0) in einigen Fällen der Fall wäre möchte "überschüssige" Präzision abschneiden, was 333333.333333333D ergibt, aber in anderen Fällen möchte man sie beibehalten, was 333333.33333333333313931D ergibt. Anstatt einfach "in Dezimal konvertieren" zu sagen, sollte der Code angeben, wie diese Konvertierung durchgeführt werden soll.
Convert.ToDecimal(double)
dieselbe ist wie (decimal)doubleTotal
, außer wenn Sie doubleTotal
zu einem anderen Typ wechseln, würden Sie wahrscheinlich einen Fehler bei der Kompilierung vermeiden und einen schwer zu findenden Laufzeitfehler einführen, weil ein anderes ToDecimal Override wird möglicherweise aufgerufen. Cast Operator ist viel expliziter ...
Nun, das ist eine alte Frage, und ich habe tatsächlich einige der hier gezeigten Antworten verwendet. In meinem speziellen Szenario war es jedoch möglich, dass der double
Wert, in den ich konvertieren wollte, decimal
oft größer war als decimal.MaxValue
. Anstatt Ausnahmen zu behandeln, habe ich diese Erweiterungsmethode geschrieben:
public static decimal ToDecimal(this double @double) =>
@double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
Der obige Ansatz funktioniert, wenn Sie sich nicht um die Behandlung von Überlaufausnahmen kümmern möchten und wenn so etwas passiert, möchten Sie nur den maximal möglichen Wert beibehalten (mein Fall), aber ich bin mir bewusst, dass dies für viele andere Szenarien nicht das erwartete Verhalten wäre und möglicherweise wird die Ausnahmebehandlung benötigt.