在C#中进行双重解析

问题描述 投票:11回答:2

我有以下代码:

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版本中的值不同。

c# double
2个回答
1
投票

我认为这个问题的简单答案是这是.NET Framework中的一个错误。我在这个问题上提交了以下机票:

https://developercommunity.visualstudio.com/content/problem/488302/issue-with-double-parser.html

由于以下动机,该问题已被关闭为“无法修复”:

.NET Core中为实现这些计算的稳定性所做的更改很大,并且承载了我们通常在.NET Framework中采用的更多风险。


0
投票

但是,不确定为什么存在差异,x86配置中的代码与x64配置中的代码不同。

x86 configuration code

x64 configuration code

© www.soinside.com 2019 - 2024. All rights reserved.