C# Konvertieren.ToDouble() verliert Nachkommastellen bei der Konvertierung von string zu double
Sagen wir, wir haben den folgenden einfachen code
string number = "93389.429999999993";
double numberAsDouble = Convert.ToDouble(number);
Console.WriteLine(numberAsDouble);
nach, dass die Umstellung numberAsDouble
variable hat den Wert 93389.43. Was kann ich tun, um diese Variablen behalten Sie die volle Nummer ohne Runden? Ich habe festgestellt, dass Convert.ToDecimal
verhält sich nicht die gleiche Weise, aber ich brauche den Wert als double.
-------------------kleines update---------------------
setzen Sie einen Haltepunkt in Zeile 2 der obige code zeigt, dass die numberAsDouble variable hat den gerundeten Wert 93389.43, bevor Sie an der Konsole angezeigt.
- Wenn ich mich Recht erinnere, ist es das Parsen
number
richtig, es ist jedoch angezeigt wird, wie ein gerundeter Wert, wenn Sie gedruckt werden. Legen Sie einen Haltepunkt, und bestätigen Sie diese. Ich kann falsch sein, obwohl, daher der Kommentar. - Bitte sehen, ob die vorherigen Antworten helfen, - stackoverflow.com/questions/tagged/... ...
- Warum müssen Sie es als ein double?
- ich übergeben zu müssen, den Wert zu verdoppeln, um eine Bibliothek für andere Berechnungen
- Und ist die übergabe in einem Wert, der 0.000000000007 anderen wird ein wesentlicher Unterschied in diesen Berechnungen? Wenn nicht einfach verdoppeln.
- Diese Bibliothek ist nicht in der Lage sein werden, mehr präzise mit einem
double
als dein code. - Das ist, was ich dachte. Aber es ist die Bibliothek, dass die Exporte dieser Nummer. Es wird aufgerufen, Gurobi, wenn Sie es wissen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
93389.429999999993
dargestellt werden können genau als 64-bit floating point Zahl. Eindouble
nur 15 oder 16 Ziffern, während Sie 17 Ziffern. Wenn Sie brauchen dieses Maß an Präzision, verwenden Sie einedecimal
statt.(Ich weiß, Sie sagen, Sie müssen es als Doppel -, sondern wenn Sie erklären könnten, warum gibt es möglicherweise Alternative Lösungen)
Dies ist das erwartete Verhalten.
Doppel kann nicht repräsentieren jede Zahl genau. Das hat nichts zu tun mit der string-Konvertierung.
Können Sie überprüfen Sie es selbst:
Druckt
93389.43
.Folgende zeigt auch dies:
Diese Drucke
True
.Beachten Sie, dass es zwei Umbauten hier Los ist. Erste, das Sie konvertieren den string in einen double, und dann bist du der Umwandlung von Doppel-zurück in einen string, um es anzuzeigen.
Müssen Sie auch berücksichtigen, dass
double
nicht unendliche Genauigkeit; abhängig von der Zeichenfolge ist, können einige Daten verloren gehen, aufgrund der Tatsache, dass ein Doppel nicht die Kapazität haben, um es zu speichern.Beim konvertieren zu einem Doppelbett geht es nicht um "Runde" nicht mehr als es muss. Es die Doppel, die am nächsten an der Anzahl zur Verfügung gestellt, angesichts der Fähigkeiten, der eine doppelte. Bei der Umwandlung von double in einen string, es ist viel mehr wahrscheinlich, dass einige Informationen nicht gehalten.
Finden Sie in der folgenden (insbesondere der erste Teil von Michael Borgwardt Antwort):
dezimal vs double! - Was sollte ich verwenden und Wann?
Doppel wird nicht immer die Genauigkeit abhängig von der Anzahl, die Sie konvertieren möchten
Wenn Sie brauchen, um genau zu sein, benötigen Sie
decimal
Dies ist eine Grenze, an der Präzision, die ein
double
speichern kann. Sie können dies selbst, indem Sie versuchen zu konvertieren3389.429999999993
statt.Den
double
Typ hat eine endliche Genauigkeit von 64 bit, also ein Rundungsfehler tritt auf, wenn die real-Zahl gespeichert wird, in der numberAsDouble variable.Eine Lösung, die funktionieren würde für dein Beispiel ist die Verwendung der
decimal
Art statt, die 128-bit-Präzision. Jedoch das gleiche problem ergibt sich bei ein kleiner Unterschied.Für beliebig große zahlen, die
System.Numerics.BigInteger
Objekt aus .NET Framework 4.0 unterstützt beliebiger Genauigkeit für ganze zahlen. Aber Sie müssen ein 3rd-party-Bibliothek zu verwenden, beliebig große reelle zahlen.Könnte man abschneiden der Nachkommastellen für die Menge der Ziffern, die Sie benötigen, nicht mehr als die doppelte Genauigkeit.
Zum Beispiel, dies wird truncate zu 5 Dezimalstellen, immer 93389.42999. Ersetzen Sie einfach 100000 für den nötigen Wert