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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top