Json.NET十进制解析舍入

本文关键字:舍入 十进制 NET Json | 更新日期: 2023-09-27 18:01:53

为什么单个小数得到四舍五入,而数组中的小数没有?

    JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    FloatParseHandling = FloatParseHandling.Decimal,
    Culture = new CultureInfo(string.Empty)
    {
        NumberFormat = new NumberFormatInfo
        {
            CurrencyDecimalDigits = 5
        }
    }
};     
string jsonData = "{'"Values'": [0.0,22493194440943108.0]}";
JObject jObject = JObject.Parse(jsonData);
decimal[] arrayOfDecimals = JsonConvert.DeserializeObject<decimal[]>(jObject["Values"].ToString());
decimal singleDecimal = JsonConvert.DeserializeObject<decimal>(jObject["Values"][1].ToString());
Console.WriteLine(JsonConvert.DeserializeObject<decimal[]>(jObject["Values"].ToString())[1]);
Console.WriteLine(JsonConvert.DeserializeObject<decimal>(jObject["Values"][1].ToString()));

输出为:

22493194440943108.0

22493194440943100

Json.NET十进制解析舍入

当您调用ToString()方法时,Json。. NET将创建它所包含的值的格式化字符串。这意味着对于jObject["Values"].ToString(),你得到:

<>之前[0.0,22493194440943108.0]之前

对于jObject["Values"][1].ToString(),你得到:

<>之前2.24931944409431 e + 16之前

反序列化这些工作,但您可以看到,单一的格式导致一些舍入。如果你真的想调用ToString然后反序列化你已经反序列化的东西(使用JObject.Parse),你可以传递Formatting.None选项-这是预期的工作:

decimal[] arrayOfDecimals = JsonConvert.DeserializeObject<decimal[]>(jObject["Values"].ToString(Newtonsoft.Json.Formatting.None));
decimal singleDecimal = JsonConvert.DeserializeObject<decimal>(jObject["Values"][1].ToString(Newtonsoft.Json.Formatting.None));