【发布时间】:2020-12-17 11:05:23
【问题描述】:
项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>[see below]</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
</Project>
代码:
Console.WriteLine(System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription);
var d = 0.41237361717224119D;
Console.WriteLine(d);
var json = Newtonsoft.Json.JsonConvert.SerializeObject(d);
Console.WriteLine(json);
d = Newtonsoft.Json.JsonConvert.DeserializeObject<double>(json);
Console.WriteLine(d);
输出(TargetFramework = netcoreapp3.1,无断点):
.NET Core 3.1.4
0.4123736171722412
0.4123736171722412
0.4123736171722412
输出(TargetFramework = netcoreapp3.1,带断点):
.NET Core 3.1.4
0.4123736171722496
0.4123736171722496
0.4123736171722496
输出(TargetFramework = net48,有/无断点):
.NET Framework 4.8.4250.0
0.412373617172241
0.41237361717224119
0.412373617172241
Main(string[] args) 中没有其他代码在 Program.cs 中。
我正在使用 JetBrains Rider 来运行它。
如您所见,双精度到字符串的转换是不同的,具体取决于
- 使用的目标 .NET 框架(.NET Framework 4.8 与 .NET Core 3.1)
- 代码中是否设置断点
- 无论是使用 Console.WriteLine 还是 Json.NET 序列化器完成
有人能解释一下为什么这种双精度到字符串的转换会因众多因素而如此不同吗? 这个操作不应该是明确定义或指定的吗? 还有哪些其他因素? CPU 还是微架构?
【问题讨论】:
-
您使用的是不同版本的 Json.NET 吗?
-
我添加了 .csproj 以进行澄清,我两次都使用 Newtonsoft.Json 12.0.3 NuGet 包。
标签: c# json.net double precision