我有一个测试,其中带有数字的 json 被反序列化,然后序列化,然后比较两个 json(原始和反序列化序列化)的字符串相等性。该项目是为 net8.0 和 net48/481 构建的。
使用
dotnet test
时,我得到以下结果:
5.32
变成了5.32
。5.32
变成了5.3200000000000003
。在 VScode 中使用小
Run Test
按钮时
我大多会通过,但有时会失败(出于与数字相关的相同原因)。在这种情况下,关闭 VSCode,关闭所有
dotnet.exe
后台进程,然后重新打开 VScode 通常可以解决问题。不幸的是,我不知道如何可靠地重现这个问题。
问题:
dotnet test
期间net8.0通过而net48/481失败?Run Test
按钮有时会给出不同的结果?这是项目文件
<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; }
}
解决您的要求很简单:
public decimal Number { get; }
原因已在我/Panagiotis 的评论中说明。