I have an issue with deserializing decimal value.
JObject.Parse("{\"available\":8777.831438322572000}")
If I type this code in VS under debugger the result is
"available": 8777.8314383225716
If I try this
obj.Value<decimal>("available")
the result is 8777.83143832257
Where am I wrong?
What api methods should I use to get correct results?
The result of JObject.Parse("{\"available\":8777.831438322572000}")
is a double
. The second statement results in a decimal
.
The double
has floating point precision, which is not that precise as a decimal
.
Required reading: Why Floating-Point Numbers May Lose Precision
I find out that this problem doesn't relate to methods which take destination type as an argument. In case of untyped version method there is a setting which allows to change how json.net treats string with decimal separator. JsonReader.FloatParseHandling
default value is FloatParseHandling.Double
In my case the way to get correct results is:
JObject.Load(new JsonTextReader(new StringReader(value)) { FloatParseHandling = FloatParseHandling.Decimal }, null)
JsonSerializer
and JsonSerializerSettings
contain the same setting.