将 .NET 对象序列化为 JSON:“double”属性值将写入具有额外小数位的不同值

Serialising .NET object to JSON: `double` property value gets written as a different value with extra decimal places

提问人:Suhaib Ahmad 提问时间:9/26/2023 最后编辑:Suhaib Ahmad 更新时间:10/2/2023 访问量:55

问:

我用于在 .NET Well 类对象和 JSON 之间(反)序列化。Well 类对象具有 List of layers ,而 Layer 类具有 Items 列表,该类具有 、 等属性。课程如下:System.Text.JsonList<Layer> layersList<Item> itemsItemstring namedouble length

public class Well
{
    public string name {get; set;}
    public List<Layer> layers {get; set;}
    
    public void serialiseJSON()
    {
        string fileName = "well.json";
        string jsonString = JsonSerialiser.Serialize(this);
        File.WriteAllText(fileName, jsonString);
        return;
    }
}
public class Layer
{
    public string name {get; set;};
    public List<Item> items {get; set;}
}
public class Item
{
    public string name {get; set;};
    public double length {get; set;}
}

例如,当值为 时,它会在序列化 Well 后写入文件。据我所知,如果我错了,请纠正我,这是由于 double 数据类型的精度,但我不明白为什么 double 值的写法不同。类实例具有正确的值,但将其序列化为 json 文件会在文件中更改它。任何帮助将不胜感激。item.length70.870.799999999999997

注意:出于一致性原因,我不希望将双精度值保存为json文件中的字符串。

.NET 序列化 精度 System.Text.json

评论

0赞 Mathan 9/26/2023
您使用的是哪个版本的 System.Text.Json?
1赞 dbc 9/26/2023
您遇到了浮点数学是否损坏的问题?。 是以 2 为底的分数,而不是以 10 为底的分数,= 是以 2 为底的连续分数:其中是重复的小数点。因此,你从来没有一个双精度值,你有一个非常接近的东西,这就是序列化的东西。如果需要真正的十进制精度,请使用 而不是 .另请参阅 .NET 中的 decimal、float 和 double 之间的区别?和 floating-point-gui.dedouble0.84/50.110011001100....110070.8decimaldouble
0赞 Suhaib Ahmad 9/26/2023
@Mathan它是版本 7.0.3
0赞 Suhaib Ahmad 9/26/2023
@dbc好的,这很有帮助。我现在把它们作为.但是,我必须使用这些类型进行计算和使用 LightningChart 绘图,并且它们应该在类型中。解决方法是,我为计算选择,但将它们保留为类定义中。这会是一个干净的解决方案吗?decimaldecimaldouble(double) startdecimal
0赞 Serge 9/26/2023
@SuhaibAhmad很抱歉,但您需要发布导致问题的示例。我试图以 length=7.8 序列化您的类,但我找不到任何问题。

答:

0赞 Suhaib Ahmad 10/2/2023 #1

我设法通过将成员更改为类型来解决这个问题Itemdecimal

public class Item
{
    public string name {get; set;};
    public decimal length {get; set;}
}