2012-04-10 12 views
6

Ich lade Daten aus einer MySQL-Datenbank in eine C# .NET-Anwendung. Die Daten werden in der Datenbank als DBType.Double gespeichert, aber zur Verwendung in meiner Anwendung werde ich mit Convert.ToDecimal() in Decimal umgewandelt. Bei den Daten handelt es sich um Positionsdaten, die bei der Vermessung verwendet werden und zur Anzeige eines 3D-Modells in einem Direct3D-Fenster verwendet werden können.Convert.ToDecimal gibt unterschiedliche Ergebnisse, wenn DirectX/Direct3D geladen wurde

Wenn das Direct3D Fenster und damit der Direct3D-DLL nicht geladen wird, funktioniert die Umwandlung in Ordnung, so dass Werte wie 1.769.301,6485186936, 5.880.300,8152837148 in der Datenbank gehalten werden als 1.769.301,64851869 geladen, 5880300,81528371. Wenn ich jedoch das Direct3D-Modul geladen habe, werden bei der Konvertierung dieselben Werte in 1769301.7112576, 5880300.79401984 konvertiert.

Der Grundcode ist als unten, wo Vertex eine Klasse/Struktur von 3 Dezimalwerte, X, Y und Z.

List<vertex> positions = new List<vertex>(); 

using (MySqlCommand cmd = new MySqlCommand("SELECT x, y, z FROM positionTable;", conn)) 
{ 

    MySqlDataReader dr = cmd.ExecuteReader(); 
    try 
    { 
    while (dr.Read()) 
    { 
     vertex position = new vertex(); 
     position.X = Convert.ToDecimal(dr[0]); 
     position.Y = Convert.ToDecimal(dr[1]); 
     position.Z = Convert.ToDecimal(dr[2]); 

     positions.Add(position); 
    } 
    } 
} 
+0

Ich würde vermuten, dass Direct3D die 'NumberFormatInfo' für den fraglichen Thread ändert. Informationen zur Einstellung finden Sie unter [NumberFormatInfo] (http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx). –

+0

@JoshuaDrake Es gibt tatsächlich eine Änderung der Gleitkommawerte (standardmäßig), nicht nur die Formatierung mit D3D9. Ich vermute, das ist das Problem. –

Antwort

5

ist Wenn Sie Ihr Direct3D-Gerät erstellen, geben Sie D3DCREATE_FPU_PRESERVE in D3DCREATE angeben. Ohne dies wird DirectX (9) den Thread wechseln, um Gleitkommaoperationen mit einfacher Genauigkeit zu verwenden, was sich auch in Ihrem verwalteten Code auf numerische Berechnungen auswirkt.

+0

Das scheint das Problem behoben zu haben. Vielen Dank, Reed. – jonew

Verwandte Themen