2012-04-10 9 views
6

Estoy cargando datos de una base de datos MySQL en una aplicación C# .NET. Los datos se guardan en la base de datos como DBType.Double, pero para usar en mi aplicación, los utilizo en Decimal usando Convert.ToDecimal(). Los datos son datos de posición utilizados en la topografía y se pueden usar para mostrar un modelo 3D en una ventana de Direct3D.Convert.ToDecimal dando resultados diferentes cuando DirectX/Direct3D cargó

Cuando la ventana Direct3D, y por lo tanto la DLL Direct3D no está cargado, la conversión funciona bien, por lo que los valores como 1.769.301,6485186936, 5880300.8152837148 celebrada en la base de datos se cargan como 1769301,64851869, 5880300,81528371. Sin embargo, si he cargado el módulo Direct3D, la conversión da como resultado los mismos valores que se convierten en 1769301.7112576, 5880300.79401984.

El código básico es como abajo, donde vértice es una clase/estructura de 3 valores decimales, X, Y y 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

Supongo que Direct3D está cambiando 'NumberFormatInfo' para el hilo en cuestión. Consulte [NumberFormatInfo] (http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx) para obtener información sobre cómo configurarlo. –

+0

@JoshuaDrake En realidad, hay un cambio en los valores de coma flotante verdadero (por defecto), no solo en el formateo, con D3D9. Sospecho que este es el problema. –

Respuesta

5

Al crear su dispositivo Direct3D, que especifique D3DCREATE_FPU_PRESERVE in D3DCREATE. Sin esto, DirectX (9) cambiará el hilo para usar operaciones de coma flotante de precisión simple, lo que tendrá un efecto en los cálculos numéricos incluso en su código administrado.

+0

Eso parece haber solucionado el problema. Muchas gracias Reed. – jonew

Cuestiones relacionadas