我遇到了一个令我困惑的问题。
这里有一些背景知识:我们正在将asp.net 2.0 Web应用程序升级到.net 4到64位服务器上。我们在新服务器和旧服务器上都部署了一个测试应用程序,以确保在我们上线之前按预期工作;两者都指向另一台服务器上的同一个数据库。
问题在于:
double totalGross;
double totalNet = 9999999.00;
float taxRate = 15.00f;
totalGross = totalNet * (1 + (taxRate / 100));
在旧服务器上,totalGross上的.ToString()会产生: 11499998.85
在新服务器上,totalGross上的.ToString()会产生: 11499998.6115814
目前还不知道为什么会这样?后一个值甚至不代表第一个未舍入的数字?
顺便说一句 - 我不是在追求纠正/改进代码的方法......只是在可能出现这种情况的原因之后!
更新
我创建了一个控制台应用程序,并在x86和x64中构建它并在服务器上运行这两个版本并输出两个不同的数字。因此,当使用double时,确实在32位和64位之间确实存在某种精度损失。令我感到惊讶的是,“有问题的精度损失为0.2,这对我来说似乎并不精确,而且差别很大?!”有人建议使用十进制类型可能更好(在我的辩护中我没有写这段代码:P)
答案 0 :(得分:2)
我认为旧服务器是32位机器?检查http://msdn.microsoft.com/en-us/library/system.double.aspx,尤其是paragrahp浮点值和精度损失。你能强制新服务器运行32位进程,它会改变什么吗?
答案 1 :(得分:1)
正如其他人所说,平台可能是罪魁祸首。 然而,我认为使用Decimal类型可能是更好的选择,并且可能不会遇到与Double相同的问题。 (我参与过的与金融业有关的每个项目都使用小数来计算货币交易)。在Decimal http://msdn.microsoft.com/en-us/library/system.decimal.aspx
的文档中没有关于浮点平台问题的说明答案 2 :(得分:0)
“此外,由于Double类型的精度损失,具有Double值的算术和赋值操作的结果可能会因平台略有不同。例如,分配文字Double值的结果可能在32-不同64位和64位版本的.NET Framework。“取自以下Link