【问题标题】:Double to string conversion different for .NET Framework and .NET Core.NET Framework 和 .NET Core 的双精度字符串转换不同
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多