.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的转换是不一样的,取决于

有人可以解释为什么这种双精度到字符串的转换会因多种因素而如此不同吗? 不应该明确定义或指定此操作吗? 还有哪些其他因素? CPU 还是微架构?

我认为这是因为 Floating-Point Parsing and Formatting improvements in .NET Core 3.0

您可以通过指定格式来解决这个问题,例如:

Console.WriteLine(d.ToString("G15"));