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));
为什么单个小数四舍五入而数组中的小数却没有?
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));