3

我对反序列化十进制值有疑问。

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

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

"available": 8777.8314383225716

如果我试试这个

obj.Value<decimal>("available")

结果是8777.83143832257

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

4

2 回答 2

4

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

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

JsonSerializerJsonSerializerSettings包含相同的设置。

于 2018-07-07T23:02:57.130 回答
3

结果JObject.Parse("{\"available\":8777.831438322572000}")是一个double。第二条语句产生一个decimal.

具有double浮点精度,不如decimal.

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

于 2018-07-06T07:32:39.383 回答