首页 > 解决方案 > System.Convert.ToDouble(decimal) 给出两个不同的答案

问题描述

我有一个非常奇怪的问题。我在即时窗口中运行它:

?(System.Convert.ToDouble(2458963.229671001113318401517D))

2458963.229671001

这是我所期望的!

然后,稍后在我的应用程序中,初始化托管 DirectX 后,我得到以下信息:

?(System.Convert.ToDouble(2458963.229671001113318401517D))

2458963.25

在我的代码中达到这一点之后,永远System.Convert.ToDouble()会返回截断和错误的结果。

我已经隔离了导致这种行为变化的单行System.Convert.ToDouble()

new Device(adapterOrdinal, dType, this, flags, m_presentParams); 

这是一个Microsoft.DirectX.Direct3D.Device对象,来自:

// Assembly: Microsoft.DirectX.Direct3D, Version=1.0.2902.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

我不确定为什么创建一个Microsoft.DirectX.Direct3D.Device会导致System.Convert.ToDouble()行为方式发生变化。

标签: c#precisionmanaged-directx

解决方案


根据https://docs.microsoft.com/en-us/previous-versions/bb324030(v%3Dvs.85)

创建设备对象时,公共语言运行时会将浮点单元 (FPU) 更改为单精度以保持更好的性能。要维护默认的双精度 FPU(公共语言运行时的默认值),请在创建 Device 对象时使用 CreateFlags.FpuPreserve 标志


推荐阅读