PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Double to String will net so wie ich will...


Matrix316
2010-11-16, 13:55:52
Sprache C#.

Also ich arbeite gerade mit google maps Geodaten und bekomme von Google einen Wert von z.B.

50.452435505069865

den Speicher ich in einem float Feld in einer SQL Datenbank ab.

Alles gut, bis ich den rauslese. Ich hätte den gerne wieder als String der genauso aussieht. Allerdings gibts da eine kleine Ungenauigkeit... nämlich:


Convert.ToDouble([Datenbankfeld]) ergibt 50.452435505069865 als Double Wert
Convert.ToDouble([Datenbankfeld]).ToString(CultureInfo.InvariantCulture) [damit es einen Punkt und kein Komma im Wert gibt] ergibt "50.4524355050699" als String...



Ich habe auch festgestellt, dass irgendwie nur 16 Zeichen erhalten bleiben, wenn ich Double to String konvertiere, ich bräuchte aber am besten alle Werte! Schreib ich mehr Werte vor das Komma, wird hinten noch mehr gekürzt. Warum bleiben nur 16 übrig? Ich kann doch viel mehr in einen String reinschreiben...

Monger
2010-11-16, 14:06:00
ToString(...) ist für jeden Datentyp unterschiedlich implementiert. Ohne angegebenen Parameter wird halt eine Standardformatierung gewählt. Eine Überladung akzeptiert einen IFormatProvider, wo du ja die aktuelle Culture übergeben hast.
Es gibt allerdings auch eine Überladung mit String, womit du eine bestimmte Formatierungssyntax angeben kannst.

Siehe hierzu auch den dazugehörigen MSDN Artikel:

http://msdn.microsoft.com/de-de/library/f71z6k0c.aspx


In der Standardeinstellung hat der Rückgabewert nur 7 gültige Ziffern, obwohl intern maximal 9 gültige Ziffern bestimmt werden. Wenn der Wert dieser Instanz mehr als 7 Ziffern erfordert, gibt die ToString(String)-Methode anstelle der erwarteten Zahl PositiveInfinitySymbol oder NegativeInfinitySymbol zurück. Wenn Sie höhere Genauigkeit benötigen, geben Sie in format als Format "G9" an, wobei immer 9 gültige Ziffern zurückgegeben werden, oder "R", wobei 7 Ziffern zurückgegeben werden, wenn die Zahl mit dieser Genauigkeit dargestellt werden kann, bzw. 9 Ziffern, wenn die Zahl nur mit maximaler Genauigkeit dargestellt werden kann.

Matrix316
2010-11-16, 14:29:51
Ok, hab festgestellt, dass Double auf 15 bzw. 17 Stellen limitiert ist, aber Decimal hat mehr... muss ich halt das nehmen.

PatkIllA
2010-11-16, 14:39:27
Ok, hab festgestellt, dass Double auf 15 bzw. 17 Stellen limitiert ist, aber Decimal hat mehr... muss ich halt das nehmen.
Das klingt nach einem grundsetzlichen Verständnisproblem von Floatingpoint auf deiner Seite.

Gast
2010-11-16, 14:44:52
Das klingt nach einem grundsetzlichen Verständnisproblem von Floatingpoint auf deiner Seite.
Das zu behaupten ist genau so valide wie zu behaupten, jemand habe ein grundsätzliches Verständnisproblem der deutschen Sprache, wenn er "grundsätzlich" mit "e" schreibt.

Matrix316
2010-11-16, 14:51:39
Das klingt nach einem grundsetzlichen Verständnisproblem von Floatingpoint auf deiner Seite.
Kann sein. Ich will einfach nur so viele Nachkommastellen wie möglich sind haben. ;) Aber ich dachte Double wäre das größte - außer Long Double, was es in C# glaube ich net gibt...

Decimal wäre ja für meine Zwecke geeignet, aber wenn ich einen SQL Server Float Wert in Decimal caste, nimmt er mir wieder Stellen weg. Caste ich einen sehr langen String in Decimal, macht er nix weg.

PatkIllA
2010-11-16, 14:55:04
Was kriegst du denn von der Datenbank als Typ wenn du nicht konvertierst?
Ein Double selbst hat aber sowas wie Dezimalstellen einfach nicht und läßt sich in vielen Fällen nicht exakt aus einem String wiederherstellen

Matrix316
2010-11-16, 15:06:43
Das Datenbank Feld war "float". Dies hol ich in einen DataSet und krieg dann:


myds.Tables[0].Rows[0]["Wert"]


Mach ich bei dem ToString() sind die zwei Stellen wieder weg.

Aber ich bin es jetzt umgangen, in dem ich das Datenbankfeld auch Decimal gemacht hab, mit 15 Nachkommastellen.

Coda
2010-11-16, 15:09:44
Was willst du denn in dem Datenbankfeld speichern?

Matrix316
2010-11-16, 15:42:41
Geokoordinaten (von Google Maps) in der Form:

50.45149278329356
oder
7.796366214752197

Coda
2010-11-16, 16:39:52
Dann ist Decimal sowieso das richtige.