Json.NET 十进制解析四舍五入

Json.NET Decimal Parsing Rounding

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

    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

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

[
  0.0,
  22493194440943108.0
]

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

2.24931944409431E+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));