.NET Framework 和 .NET Core 的双重字符串转换不同
Double to string conversion different for .NET Framework and .NET Core
项目文件:
<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,with/without断点):
.NET Framework 4.8.4250.0
0.412373617172241
0.41237361717224119
0.412373617172241
Program.cs
里面的Main(string[] args)
没有其他代码。
我正在使用 JetBrains Rider 运行 这个。
可以看到,double到string的转换是不一样的,取决于
- 使用的目标 .NET 框架(.NET Framework 4.8 与 .NET Core 3.1)
- 代码中是否设置断点
- 是否使用 Console.WriteLine 或 Json.NET 序列化程序
有人可以解释为什么这种双精度到字符串的转换会因多种因素而如此不同吗?
不应该明确定义或指定此操作吗?
还有哪些其他因素? CPU 还是微架构?
我认为这是因为 Floating-Point Parsing and Formatting improvements in .NET Core 3.0。
您可以通过指定格式来解决这个问题,例如:
Console.WriteLine(d.ToString("G15"));
项目文件:
<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,with/without断点):
.NET Framework 4.8.4250.0
0.412373617172241
0.41237361717224119
0.412373617172241
Program.cs
里面的Main(string[] args)
没有其他代码。
我正在使用 JetBrains Rider 运行 这个。
可以看到,double到string的转换是不一样的,取决于
- 使用的目标 .NET 框架(.NET Framework 4.8 与 .NET Core 3.1)
- 代码中是否设置断点
- 是否使用 Console.WriteLine 或 Json.NET 序列化程序
有人可以解释为什么这种双精度到字符串的转换会因多种因素而如此不同吗? 不应该明确定义或指定此操作吗? 还有哪些其他因素? CPU 还是微架构?
我认为这是因为 Floating-Point Parsing and Formatting improvements in .NET Core 3.0。
您可以通过指定格式来解决这个问题,例如:
Console.WriteLine(d.ToString("G15"));