Zusammenfassung des Problems:
Für einige Dezimalwerte wird bei der Umwandlung des Typs von decimal in double eine kleine Bruchzahl zum Ergebnis hinzugefügt.
Noch schlimmer ist, dass es zwei "gleiche" Dezimalwerte geben kann, die zu unterschiedlichen Double-Werten führen, wenn sie umgewandelt werden.
Codebeispiel:
decimal dcm = 8224055000.0000000000m; // dcm = 8224055000
double dbl = Convert.ToDouble(dcm); // dbl = 8224055000.000001
decimal dcm2 = Convert.ToDecimal(dbl); // dcm2 = 8224055000
double dbl2 = Convert.ToDouble(dcm2); // dbl2 = 8224055000.0
decimal deltaDcm = dcm2 - dcm; // deltaDcm = 0
double deltaDbl = dbl2 - dbl; // deltaDbl = -0.00000095367431640625
Schauen Sie sich die Ergebnisse in den Kommentaren an. Die Ergebnisse wurden aus der Beobachtung des Debuggers kopiert. Die Zahlen, die diesen Effekt erzeugen, haben weit weniger Dezimalstellen als das Limit der Datentypen, daher kann es kein Überlauf sein (vermute ich!).
Was noch viel interessanter ist, ist, dass es zwei gleiche Dezimalwerte geben kann (im obigen Codebeispiel sehen Sie "dcm" und "dcm2" mit "deltaDcm" gleich null), die zu unterschiedlichen Double-Werten führen, wenn sie umgewandelt werden. (Im Code "dbl" und "dbl2", die einen Nicht-Null-"deltaDbl" haben)
Ich vermute, es sollte etwas mit dem Unterschied in der bitweisen Darstellung der Zahlen in den beiden Datentypen zu tun haben, aber ich kann nicht herausfinden, was! Und ich muss wissen, was zu tun ist, um die Umwandlung so zu machen, wie ich es brauche. (wie z.B. dcm2 -> dbl2)
1 Stimmen
Ich habe dieses Problem auf MS Connect gemeldet. Hier ist der Link: connect.microsoft.com/VisualStudio/feedback/…
0 Stimmen
Ich bin mir nicht sicher, was der Grund ist, aber es scheint, dass das Problem in den (6) großen Dezimalstellen liegt. Ich habe mit 5 Dezimalstellen getestet und es funktioniert einwandfrei. Ich habe ein ähnliches Szenario, bei dem ich von Dezimal zu Double und zurück umwandle und da meine Genauigkeit nur 2 Dezimalstellen beträgt, ist mein Code sicher konvertiert.