我有一些行为奇怪的代码,似乎是对两个双精度值相加的结果进行四舍五入。这导致我的代码出现问题。
不幸的是,我无法解决这个问题,因为我的单元测试环境工作正常(不是四舍五入)而且我的应用程序不正常(四舍五入)。
在我的测试环境中:
a = -3.7468700408935547
b = 525218.0
c = b + a
c = 525214.25312995911
在我的应用程序中:
a = -3.7468700408935547
b = 525218.0
c = b + a
c = 525214.25
这可能是什么原因造成的?项目配置?(我正在使用视觉工作室,顺便说一句)
编辑(来自评论)
我正在使用 Visual Studio 调试器单步执行相同的代码,所以它是完全相同的一段代码。
我有更多代码,但我将问题缩小到那个特定的总和。
每个值的二进制表示是:
测试环境:
System.BitConverter.ToString(System.BitConverter.GetBytes(a)) "00-00-00-00-97-F9-0D-C0" string
System.BitConverter.ToString(System.BitConverter.GetBytes(b)) "00-00-00-00-44-07-20-41" string
System.BitConverter.ToString(System.BitConverter.GetBytes(c)) "00-40-9A-81-3C-07-20-41" string
内部应用:
System.BitConverter.ToString(System.BitConverter.GetBytes(a)) "00-00-00-00-97-F9-0D-C0" string
System.BitConverter.ToString(System.BitConverter.GetBytes(b)) "00-00-00-00-44-07-20-41" string
System.BitConverter.ToString(System.BitConverter.GetBytes(c)) "00-00-00-80-3C-07-20-41" string
编辑2:
正如Alexei Levenkov指出的那样,这个问题是由更改 FPU 配置的库引起的。
对于任何好奇这对我意味着什么的人:我能够通过对我的输入值做出一些假设并进行一些先发制人的值四舍五入,从而使我的计算保持一致,从而减轻了我的特定代码段的这个问题。