我有以下代码:
var d = double.Parse("4796.400000000001");
Console.WriteLine(d.ToString("G17", CultureInfo.InvariantCulture));
如果我在Visual Studio中使用x86配置编译并运行它,那么我得到以下输出:
4796.4000000000005
如果我改为编译为x64,我得到这个:
4796.4000000000015
我意识到使用32 och 64位编译必须影响系统处理double值的方式,但是假设C#将double定义为64位,那么此操作的结果是否应该与我使用的编译配置无关?
补充观察
基于关于double.Parse的评论我写了这段代码:
var d0 = double.Parse("4796.400000000001");
double d1 = 4796.400000000001;
Console.WriteLine("d0: " + d0.ToString("G17", CultureInfo.InvariantCulture));
Console.WriteLine("d1: " + d1.ToString("G17", CultureInfo.InvariantCulture));
编译为x86时,我得到以下输出:
d0: 4796.4000000000005
d1: 4796.4000000000005
但是当我编译为x64时,我得到了这个:
d0: 4796.4000000000015
d1: 4796.4000000000005
请注意x64版本中的值有何不同,但x86版本中的值不同。
我认为这个问题的简单答案是这是.NET Framework中的一个错误。我在这个问题上提交了以下机票:
https://developercommunity.visualstudio.com/content/problem/488302/issue-with-double-parser.html
由于以下动机,该问题已被关闭为“无法修复”:
.NET Core中为实现这些计算的稳定性所做的更改很大,并且承载了我们通常在.NET Framework中采用的更多风险。