Problem in double.Parse in Managed C ++
-
11-09-2019 - |
Frage
Ich erhalte eine seltsame Problem, während einen doppelten Wert in Managed C ++ Parsen. Es kann sein, dass ich etwas falsch mache. Wenn ich tun:
double value = 0.006;
result = Math::Parse( value)
Die Ausgabe des Ergebnisses ist 0.006000000000001
. Warum es ein 1 anhängt?
Auch wenn ich eine Runde um den Wert zu 5 Dezimalstellen gehen, es funktioniert nicht. Ich tue:
result2 = Math::Round(result, 5)
Aber result2
ist immer 0.006000000000001
. Was mache ich falsch?
Lösung
Es ist normal. Dieses Problem wird verursacht durch IEEE-Format von Doppel - in Echt 0.006 wird als Annäherung der unendlichen Binärbruch dargestellt. So haben Sie 3 Möglichkeiten -
- Verwendung entsprechende Zeichenfolge Formatierung ausgeben
- verwenden Dezimal Typ
- nicht verwenden == Zahlen zu vergleichen, verwenden Sie stattdessen
mit konstanten Fehlern, z: (X -0,06)
Andere Tipps
Dies ist auf Präzision. Ich habe diese Antwort hier :
Floats und Doppelzimmer Zahl Darstellungen mit einer bestimmten Präzision. Nicht jeder Wert sein in diesem Format dargestellt. Sehen auch.
Sie können leicht denken, warum dies würde der Fall sein: Es gibt eine unbegrenzte Zahl der Zahl nur in dem intervall (1..1), aber ein Schwimmer nur eine begrenzte Anzahl der Bits alle darstellen Zahlen in (-MAXFLOAT..MAXFLOAT).
Mehr treffend gesagt: in einem 32-Bit-Integer- Darstellung besteht eine zählbare Anzahl der ganzen Zahlen dargestellt werden, Aber es gibt eine unendliche unzählige Anzahl der realen Werte, die nicht sein kann vollständig in einem begrenzten vertreten Darstellung von 32 oder 64 Bit. Daher gibt es nicht nur eine Grenze die höchsten und niedrigsten darstellbaren realer Wert, sondern auch auf die Genauigkeit.
Warum ist eine Zahl, die wenig hat Stellen nach dem Gleitkomma- betroffen? Da die Darstellung auf einem binären System basiert statt eine Dezimalzahl, andere Zahlen machen leicht repräsentiert dann die Dezimalzahl Einsen.
Zahlen mit doppelter Genauigkeit sind im wesentlichen Annäherungen, und häufig Schwanz haben, die Sie auf können nicht loswerden - d. H gibt es keine Möglichkeit, die Anzahl genauer auszudrücken
Sie können Ergebnisse eher wie Sie bekommen erwarten, wenn Sie decimal
verwenden - die noch eine Annäherung ist, aber es nutzt Basis 10, neigt dazu, so zu verhalten sich mehr wie die Menschen erwarten. Aber weil es nicht auf einen CPU-Typ abbildet, ist es langsamer.