"1.79769313486232E + 308" konvertieren, um ohne OverflowException zu verdoppeln?

9

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

    
Eric Schoonover 20.04.2009, 04:43
quelle

6 Antworten

11

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 .

    
codekaizen 20.04.2009, 05:25
quelle
21

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.

    
Jon Skeet 20.04.2009 05:28
quelle
1

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.

    
Adam Robinson 20.04.2009 04:51
quelle
1

Hier ist, was ich mir ausgedacht habe. Danke Jon Skeet und Codecaizen.

%Vor%     
Eric Schoonover 20.04.2009 07:29
quelle
1

Demonstriert das Problem und eine Lösung:

%Vor%     
Corey Alix 17.05.2012 16:28
quelle
-2

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.

    
Jamie Penney 20.04.2009 04:53
quelle

Tags und Links