6

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

当 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);
    }
  }
}
4

1 回答 1

5

创建 Direct3D 设备时,您要D3DCREATE_FPU_PRESERVED3DCREATE. 如果没有这个,DirectX (9) 将切换线程以使用单精度浮点运算,这将对数值计算产生影响,即使在您的托管代码中也是如此。

于 2012-04-10T21:17:01.827 回答