我有一些行为奇怪的代码,似乎是在添加两个 double 值的结果四舍五入。这导致我的代码出现问题。
不幸的是我无法解决这个问题,因为我的单元测试环境工作正常(没有舍入)而且我的应用程序不正常(舍入)。
在我的测试环境中:
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,顺便说一句)
编辑(来自评论)
我正在使用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配置的库引起的。
对于任何好奇这对我来说意味着什么的人: 我能够通过对输入值进行一些假设并对一些抢占值进行四舍五入来缓解我的特定代码段的问题,这反过来又使我的计算保持一致。 子>
答案 0 :(得分:2)
如果想要财务计算中需要的预处理,请使用小数。
修改强> 见:
答案 1 :(得分:1)
您的应用程序可能在配置FPU时做了一些奇怪的事情。即使用一些随机库进行数学运算,重新配置精度...
Direct3d可能是可疑的,例如参见Pow implementation for double。