C# web服务器之间的.Net分区舍入/小数差
我有一个问题,目前让我有点困惑 这里有一点背景:我们正在将asp.net 2.0 web应用程序升级到64位服务器上的.net 4。我们在新服务器和旧服务器上都部署了一个测试应用程序,以确保在我们上线之前一切正常;两者都指向另一台服务器上的同一数据库 问题是:C# web服务器之间的.Net分区舍入/小数差,c#,asp.net,math,C#,Asp.net,Math,我有一个问题,目前让我有点困惑 这里有一点背景:我们正在将asp.net 2.0 web应用程序升级到64位服务器上的.net 4。我们在新服务器和旧服务器上都部署了一个测试应用程序,以确保在我们上线之前一切正常;两者都指向另一台服务器上的同一数据库 问题是: double totalGross; double totalNet = 9999999.00; float taxRate = 15.00f; totalGross = totalNet * (1 + (taxRate / 100))
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)
我想旧服务器是一台32位的机器?检查,尤其是paragrahp浮点值和精度损失。你能强迫新服务器运行32位进程吗?它会改变什么吗?
“此外,由于双精度类型的精度损失,具有双精度值的算术运算和赋值运算的结果可能因平台而异。例如,在32位和64位版本的.NET Framework中,分配文本双精度值的结果可能不同。“正如其他人所提到的,从以下几点来看,平台可能是罪魁祸首然而,我认为使用Decimal类型可能是一个更好的选择,可能不会遇到与Double相同的问题。(我所从事的与金融业相关的每个项目都使用十进制计算货币交易)。Decimal文档中没有关于浮点平台问题的注释这很奇怪,因为我刚刚在64位和32位计算机上运行了该代码,都得到了11499998.85。您确定没有任何东西会改变这些值吗?假设说,如果您使用更适合金融计算的类型运行代码,你会观察到什么结果?可以证实Jethros的发现。您能检查一下系统上的区域性设置吗?可能是ToString()的问题。。