我有以下代码:
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版本中没有差异。
我认为这个问题的简单答案是这是 .NET Framework 中的一个错误。我就该问题提交了以下票证:
https://developercommunity.visualstudio.com/content/problem/488302/issue-with-double-parser.html
该问题已被关闭为“无法修复”,原因如下:
.NET Core 中为实现这些计算的稳定性而进行的更改很大,并且比我们通常在 .NET Framework 中承担的风险更大。
归档时间: |
|
查看次数: |
240 次 |
最近记录: |