Entwickler-Ecke

WinForms - Datentypkonvertierung von String nach Double unklar


syntec - Sa 17.09.11 22:25
Titel: Datentypkonvertierung von String nach Double unklar
Hallo,

irgendwie hänge ich an einer Konvertierungssachen, die ich nicht wirklich verstehe.
Ich lasse mir Zahlen, die ich aus einer Textdatei einlese, in einen DGV darstellen.
Diese Zahlen möchte ich nun im Grid ändern, dürfen aber einen Maximalwert, der ebenfalls im Grid steht und eingelesen wurde, nicht überschreiten.
Mit Hilfe von

Quelltext
1:
double Wert = Double.Parse(DGV.Rows[e.RowIndex].Cells[3].Value.ToString());                    

werden die Daten eingelesen und mit einer if-Anweisung verglichen.
Dummerweise sind die Werte ab und zu im Format: 1.000000000000000.
Die Werte werden aber nur mit einer Nachkommastelle betrachtet, so dass kleinere Veränderungen gar nicht berücksichtigt werden... Muss ich da vorher noch irgendwie eine Formatanweisung angeben, um mehr Nachkommastellen betrachten zu können?

Quelltext
1:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");                    

Habe ich nach InitializeComponent(); bereits gesetzt.

Danke,


Kha - Sa 17.09.11 22:52

user profile iconsyntec hat folgendes geschrieben Zum zitierten Posting springen:
Die Werte werden aber nur mit einer Nachkommastelle betrachtet, so dass kleinere Veränderungen gar nicht berücksichtigt werden...
Kannst du das vielleicht etwas ausführen? Grundsätzlich werden alle Double-Berechnungen natürlich mit maximaler Genauigkeit ausgeführt und bei einer Rückkonvertierung (je nach Format Specifier) in der knappesten Darstellung angegeben.


syntec - So 18.09.11 11:56

Hallo Kha,

ich habe es mit deciamal versucht, da dieser eine höhere Genauigkeit bietet.
Folgendermaßen sind es so aus:

Quelltext
1:
2:
3:
4:
5:
decimal Wert = 2.000000000000001m;
decimal Max = 2.000000000000000m;
decimal erg = Wert - Max;

// Debugger sagt: Max = 2 und erg = 0

erg müsste aber 0.000000000000001 lauten. Warum macht er es nicht so?


Ralf Jansen - So 18.09.11 12:11

Dein gezeigter Code macht es so. Wenn er es bei dir nicht macht solltest du ein wenig mehr Context um deinen Testcode zeigen.


syntec - So 18.09.11 14:18

So wie es jetzt aussieht, scheint es nun zu funktionieren.
Wollte ein Beispiel für das Topic bauen, konnte mein Problem aber nicht reproduizieren... :)

Eine abschließende Frage habe ich aber noch.
Der Benutzer kann den Wert ja im Grid ändern. Kann man den geänderten Wert dann nach Bestätigen in das ursprüngliche Format wandeln lassen, oder geht das nur mit aufwendigerer Methode (Schleife o.ä.)?
Sprich:
ursprünglicher Wert: 2.00000000000000
eingegebener Benutzerwert: 2.004
umwandeln in: 2.004000000000000

Danke,


Ralf Jansen - So 18.09.11 14:49

Wenn du explizit umwandeln willst dann hat jeder Datentyp eine ToString [http://msdn.microsoft.com/de-de/library/fzeeb5cd.aspx] Methode mit entsprechenden Überladungen um das Format zu spezifizieren. Wenn ein Control per Databinding befüllst mußt du beim Binding das entsprechende Format angeben. Im speziellen fürs DataGridView siehe hier [http://msdn.microsoft.com/de-de/library/f9x2790s(v=VS.90).aspx].