Json.NET十进制精度损失

时间:2018-07-06 07:29:53

标签: c# json.net decimal linq-to-json

我反序列化十进制值时遇到问题。

JObject.Parse("{\"available\":8777.831438322572000}")

如果我在VS下的调试器中键入此代码,则结果为

"available": 8777.8314383225716

如果我尝试这个

obj.Value<decimal>("available")

结果是8777.83143832257

我在哪里错了? 我应该使用哪种api方法来获得正确的结果?

2 个答案:

答案 0 :(得分:3)

JObject.Parse("{\"available\":8777.831438322572000}")的结果为double。第二条语句的结果为decimal

double具有浮点精度,不如decimal那样精确。

必读:Why Floating-Point Numbers May Lose Precision

答案 1 :(得分:2)

我发现此问题与以目标类型为参数的方法无关。在无类型版本方法的情况下,有一个设置可以更改json.net使用小数分隔符对待字符串的方式。 JsonReader.FloatParseHandling的默认值为FloatParseHandling.Double 就我而言,获得正确结果的方法是:

JObject.Load(new JsonTextReader(new StringReader(value)) { FloatParseHandling = FloatParseHandling.Decimal }, null)

JsonSerializerJsonSerializerSettings包含相同的设置。