System.Text.Json 反序列化-序列化数字会为某些 .NET 版本提供稍微偏离的数字

问题描述 投票:0回答:1

我有一个测试,其中带有数字的 json 被反序列化,然后序列化,然后比较两个 json(原始和反序列化序列化)的字符串相等性。该项目是为 net8.0 和 net48/481 构建的。

使用

dotnet test
时,我得到以下结果:

  • net8.0通过;原来的数字
    5.32
    变成了
    5.32
  • net48/481不通过;原来的数字
    5.32
    变成了
    5.3200000000000003

在 VScode 中使用小

Run Test
按钮时

enter image description here

我大多会通过,但有时会失败(出于与数字相关的相同原因)。在这种情况下,关闭 VSCode,关闭所有

dotnet.exe
后台进程,然后重新打开 VScode 通常可以解决问题。不幸的是,我不知道如何可靠地重现这个问题。

问题:

  • 为什么
    dotnet test
    期间net8.0通过而net48/481失败?
  • 为什么
    Run Test
    按钮有时会给出不同的结果?
  • 如何确保从 json 反序列化的任何数字都序列化为完全相同的数字字符串?

这是项目文件

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net8.0-windows;net481;net48</TargetFrameworks>
    <LangVersion>10.0</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
    <PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
    <PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
    <PackageReference Include="coverlet.collector" Version="3.1.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net48' Or '$(TargetFramework)' == 'net481'">
        <PackageReference Include="System.Text.Json" Version="8.0.4" />
    </ItemGroup>

</Project>

和测试文件

using System.Text.Json;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class NumberSerializingTests
{

    [TestMethod]
    public void TestNumberSerializing()
    {
        var json = "{\"Number\":5.32}";
        var data = JsonSerializer.Deserialize<MyNumber>("{\"Number\":5.32}");
        var json2 = JsonSerializer.Serialize(data);
        Assert.AreEqual(json, json2);
    }
}

public class MyNumber
{
    public MyNumber(double number) { Number = number; }
    public double Number { get; }
}
json .net precision mstest system.text.json
1个回答
0
投票

解决您的要求很简单:

public decimal Number { get; }

原因已在我/Panagiotis 的评论中说明。

© www.soinside.com 2019 - 2024. All rights reserved.