在C#中进行双重解析

Øys*_*rud 11 c# double

我有以下代码:

var d = double.Parse("4796.400000000001");
Console.WriteLine(d.ToString("G17", CultureInfo.InvariantCulture));
Run Code Online (Sandbox Code Playgroud)

如果我在Visual Studio中使用x86配置进行编译和运行,则会得到以下输出:

4796.4000000000005
Run Code Online (Sandbox Code Playgroud)

如果我改为编译为x64,则会得到以下信息:

4796.4000000000015
Run Code Online (Sandbox Code Playgroud)

我意识到使用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));
Run Code Online (Sandbox Code Playgroud)

当编译为x86时,我得到以下输出:

d0: 4796.4000000000005
d1: 4796.4000000000005
Run Code Online (Sandbox Code Playgroud)

但是当我编译为x64时,我得到了这个:

d0: 4796.4000000000015
d1: 4796.4000000000005
Run Code Online (Sandbox Code Playgroud)

请注意,值在x64版本中有所不同,但在x86版本中没有差异。

Øys*_*rud 1

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

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

该问题已被关闭为“无法修复”,原因如下:

.NET Core 中为实现这些计算的稳定性而进行的更改很大,并且比我们通常在 .NET Framework 中承担的风险更大。