Dies wird einigen wie eine dumme Frage erscheinen, aber ich muss ein Doppel in eine Dezimalzahl umwandeln, um sie als Währung zu verwenden. Wohin geht das M?
decimal dtot = (decimal)(doubleTotal);
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 :Sie sollten Folgendes verwenden,
M
wenn Sie einen neuen wörtlichen Dezimalwert deklarieren:(Ohne das
M
wird 123.45 als Double behandelt und nicht kompiliert.)quelle
Standardkonvertierungsklasse verwenden:
Convert.ToDecimal(Double)
quelle
quelle
double
bis zuzulassendecimal
, da dies für einendouble
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 SiedoubleTotal
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 alsdecimal.MaxValue
. Anstatt Ausnahmen zu behandeln, habe ich diese Erweiterungsmethode geschrieben: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.
quelle