Ich habe diese Zeichenfolge "1.79769313486232E + 308" und versuche, sie in einen numerischen Wert von .NET zu konvertieren (double?), bekomme aber die folgende Ausnahme. Ich verwende Convert.ToDouble()
. Was ist der richtige Weg für diese Konvertierung?
OverflowException: Wert war entweder zu groß oder zu klein für ein Double
Das Problem liegt wahrscheinlich daran, dass Double.MaxValue
in eine Zeichenkette umgewandelt wurde, und wenn die Zeichenkette ausgegeben wird, werden nicht alle Ziffern ausgegeben, stattdessen wird sie gerundet. Wenn Sie diesen Wert analysieren, wird der doppelte Wert überschritten.
Die Verwendung von Double.TryParse
und die anschließende Überprüfung der Gleichheit in der Zeichenfolge "1.79769313486232E + 308" im Falle eines Fehlers und die Verwendung von Double.MaxValue
sollte eine schnelle Lösung sein, wenn Sie die Zeichenfolge so beibehalten müssen, wie sie ist.
EDIT: Wenn Sie die Zeichenfolge nicht so beibehalten müssen, wie sie ist, verwenden Sie Round Trip-Format-Spezifizierer , um die Zeichenfolge an erster Stelle zu erstellen, als Jon beschreibt in seiner Antwort .
Leider ist dieser Wert größer als double.MaxValue
, daher die Ausnahme.
Wie Codecazen vorschlägt, könnten Sie einen Test für die Zeichenfolge fest codieren. Eine bessere (IMO) Alternative, wenn Sie die Zeichenfolge zuerst erzeugen, ist die Verwendung des Formatbezeichners "r". Dann wird die von Ihnen erzeugte Zeichenfolge "1.7976931348623157E + 308" sein, die dann korrekt analysiert:
%Vor%Natürlich ist das keine Hilfe, wenn Sie die Daten nicht kontrollieren können - aber dann sollten Sie verstehen, dass Sie in diesem Fall wahrscheinlich bereits Daten verlieren.
Sie können double.Parse()
oder double.TryParse()
anstelle von Convert.ToDouble()
versuchen, aber ich bin mir nicht sicher, ob Sie bessere Ergebnisse erzielen werden. Übrigens ist die von Ihnen angegebene Zeichenfolge gleich double.MaxValue
, was (natürlich) der Maximalwert ist, der in einem Double enthalten sein kann, daher ist es wahrscheinlich, wo Ihr Fehler herkommt. Fließkomma numerische Typen sind knifflig, also würde ich annehmen, dass irgendeine Art von Rundung stattfindet und sie außerhalb der Grenzen des Typs verschiebt.
Sie könnten auch den Datentyp decimal
ausprobieren. Vielleicht haben Sie dort mehr Glück.
Hier ist, was ich mir ausgedacht habe. Danke Jon Skeet und Codecaizen.
%Vor%Diese Zahl ist zu groß für ein Double, wie die Ausnahme sagt. Sie müssen eine große Zahlenbibliothek finden, um das für Sie zu handhaben, da es nichts gibt, von dem ich in der .Net-Bibliothek weiß, die sehr große Zahlen behandelt.