C# System.Text.Json "rounds" 在序列化期间加倍

C# System.Text.Json "rounds" doubles during serialization

我使用System.Text.Json反序列化一些东西然后序列化它。问题是,例如 double 值 99.6 被反序列化,然后序列化为 99.599999999999994.

我该怎么办?

这是控制台应用程序中的复制品。

using System;
using System.Text.Json;

namespace ConsolePG3
{
    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person { Value = 99.6 };

            var text = JsonSerializer.Serialize(person);
            Console.WriteLine(text);
            Console.ReadLine();
        }
    }
    class Person
    {
        public double Value { get; set; }
    }
}

重要的是让你的头脑明白这里的 double 值为 99.6 不存在,并且从未存在过 。你想象出来了。它在您编译它的那一刻就被四舍五入了。由于浮点运算 的工作方式 ,根本不可能在浮点运算中表示 精确 99.6。序列化程序已正确序列化 存在的实际值

如果您想以人们倾向于认为的方式表示离散值 - 使用decimal而不是浮点数(float , double).它 (decimal) 在精度方面 受限(并且未 CPU 优化),但它的近似方式与人类近似,它会很容易地讲述大多数常见场景的确切值。

坦率地说,当您考虑“精确值”时:浮点数不是一个好的选择。