提问者:小点点

Json.NET十进制精度损失


我有一个反序列化十进制值的问题。

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

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

"available": 8777.8314383225716

如果我试试这个

obj.Value<decimal>("available")

结果是8777.83143832257

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


共2个答案

匿名用户

我发现这个问题与将目标类型作为参数的方法无关。在无类型版本方法的情况下,有一个设置允许更改json.net如何使用十进制分隔符处理字符串。JsonReader. FloatParseHandling默认值是FloatParseHandling.Double在我的例子中,获得正确结果的方法是:

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

JsonSerializerJsonSerializerSettings包含相同的设置。

匿名用户

JObject. Parse("{\"可用\":8777.831438322572000}")的结果是一个双精度。第二条语句产生一个十进制

double具有浮点精度,不像十进制那么精确。

必读:为什么浮点数可能会失去精度