C# Convert.ToDecimal在加载DirectX/Direct3D时提供不同的结果

C# Convert.ToDecimal在加载DirectX/Direct3D时提供不同的结果,c#,mysql,direct3d,C#,Mysql,Direct3d,我正在将MySQL数据库中的数据加载到C.NET应用程序中。数据作为DBType.Double保存在数据库中,但为了在应用程序中使用,我使用Convert.ToDecimal将其转换为十进制。该数据是测量中使用的位置数据,可用于在Direct3D窗口中显示三维模型 当Direct3D窗口以及Direct3D dll未加载时,转换工作正常,因此数据库中保存的值(如1769301.6485186936、5880300.8152837148)将加载为1769301.64851869、5880300.8

我正在将MySQL数据库中的数据加载到C.NET应用程序中。数据作为DBType.Double保存在数据库中,但为了在应用程序中使用,我使用Convert.ToDecimal将其转换为十进制。该数据是测量中使用的位置数据,可用于在Direct3D窗口中显示三维模型

当Direct3D窗口以及Direct3D dll未加载时,转换工作正常,因此数据库中保存的值(如1769301.6485186936、5880300.8152837148)将加载为1769301.64851869、5880300.81528371。但是,如果已加载Direct3D模块,则转换结果将相同的值转换为1769301.7112576、5880300.79401984

基本代码如下所示,其中vertex是一个包含3个十进制值X、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);
    }
  }
}

创建Direct3D设备时,您需要指定。如果没有这一点,DirectX 9会将线程切换为使用单精度浮点运算,这甚至会对托管代码中的数值计算产生影响。

我猜Direct3D正在更改所讨论线程的NumberFormatInfo。有关设置的信息,请参阅。@JoshuaDrake D3D9默认情况下,真浮点值实际上发生了更改,而不仅仅是格式更改。我怀疑这就是问题所在。