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

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

基本代码如下所示,其中顶点是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设备时,可以指定 D3DCREATE_FPU_PRESERVE in D3DCREATE 。否则,DirectX(9)会将线程切换为使用单精度浮点运算,即使在您托管的代码中,这也会影响数值计算。

关于c# - 加载DirectX/Direct3D时的Convert.ToDecimal给出不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10096527/

10-10 07:10