Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web服务器之间的.Net分区舍入/小数差_C#_Asp.net_Math - Fatal编程技术网

C# web服务器之间的.Net分区舍入/小数差

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))

我有一个问题,目前让我有点困惑

这里有一点背景:我们正在将asp.net 2.0 web应用程序升级到64位服务器上的.net 4。我们在新服务器和旧服务器上都部署了一个测试应用程序,以确保在我们上线之前一切正常;两者都指向另一台服务器上的同一数据库

问题是:

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()的问题。。