Json.NET decimal precision loss

Multi tool use
Multi tool use


Json.NET decimal precision loss



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


8777.83143832257



Where am I wrong?
What api methods should I use to get correct results?





Possible duplicate of Handling decimal values in Newtonsoft.Json
– mjwills
yesterday




2 Answers
2



The result of JObject.Parse("{"available":8777.831438322572000}") is a double. The second statement results in a decimal.


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


double


decimal



The double has floating point precision, which is not that precise as a decimal.


double


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:


JsonReader.FloatParseHandling


FloatParseHandling.Double


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



JsonSerializer and JsonSerializerSettings contain the same setting.


JsonSerializer


JsonSerializerSettings






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

2RkO,RVs,6blTfE,XjRZ
S uX0NTYwDJWe eM

Popular posts from this blog

PHP contact form sending but not receiving emails

Do graphics cards have individual ID by which single devices can be distinguished?

Create weekly swift ios local notifications