Entwickler-Ecke

Basistechnologien - Problem mit Double.ToString()


SpyderZ3r0 - Mi 20.10.10 14:29
Titel: Problem mit Double.ToString()
Hi

Also ich hab eine double Variable die hat den Wert: 0.99999701976776123
Wenn ich die Variable jetzt in String umwandle Wert.toString();
bekomm ich den Wert: 0.999997019767761

Da fehlen mir jetzt die letzten stellen die brauch ich aber.

Was kann ich machen?

ich hab schon Wert.toString("0.0000000000000000000000000000000000000000"); versucht hat aber nix gebracht
kommt nur 0.99999701976776100000000000000000000000000000000 raus.


huuuuuh - Mi 20.10.10 15:20

der Computer kann nur eine Begrenzte Anzahl Nachkommastellen speichern. Das ganze ist relativ kompliziert, such einfach mal nach Suche bei Google GLEITKOMMAZAHL.
Musst du denn mit der Zahl rechnen? und wo kommt der Wert her?


SpyderZ3r0 - Mi 20.10.10 15:34

ich hab den wert schon im rechner in einer variablen.

Ich seh den wert ja im debug

Sobald der aber zu string convertiert wird fallen hinten zahlen weg


huuuuuh - Mi 20.10.10 16:55

wenns nur ums konvertieren und ausgeben geht:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
string swert = wert.ToString();
wert *= Math.Pow(10, swert.Length); //Alle Nachkommastellen vors Komma bringen
swert = "";
while (wert > 0)
{
   double t = wert % 10;                 //letzte stelle herausfinden
   wert -= t;                            //letzte stelle abziehen
   wert = wert / 10;                     //letzte stelle "löschen"
   swert = ((int)t).ToString() + swert;  //letzte stelle dem string hinzufügen
}
swert = "0."+swert;               //0. davorsetzen


Ralf Jansen - Mi 20.10.10 16:58

Du solltest den richtigen Formatstring verwenden. Vermutlich

C#-Quelltext
1:
Wert.ToString("R")                    

Aber den richtigen Formatstring solltest du dir nach deiner Definition von ~genau~ aus der Doku raus suchen.


Yogu - Mi 20.10.10 18:48

Bei float's und double's müssen einfach die letzten Stellen gerundet werden, da ansonsten seltsame Rechenfehler auftreten. Auch ein Taschenrechner speichert intern mehr Stellen, als er anzeigt.

Wenn es dir wirklich auf die Stelle genau ankommt, solltest du lieber den Typ Decimal [http://msdn.microsoft.com/de-de/library/system.decimal.aspx] verwenden. Im Gegensatz zu float und double rechnet er im Dezimalsystem und kann daher immer verlässlich angezeigt werden.