Json.NET потеря десятичной точности - PullRequest
0 голосов
/ 06 июля 2018

У меня проблема с десериализацией десятичного значения.

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

Если я введу этот код в VS под отладчиком, результат будет

"available": 8777.8314383225716

Если я попробую это

obj.Value<decimal>("available")

результат 8777.83143832257

Где я не прав? Какие методы API я должен использовать, чтобы получить правильные результаты?

Ответы [ 2 ]

0 голосов
/ 08 июля 2018

Я обнаружил, что эта проблема не относится к методам, которые принимают тип назначения в качестве аргумента. В случае метода нетипизированной версии есть настройка, которая позволяет изменить способ, которым json.net обрабатывает строку с десятичным разделителем. JsonReader.FloatParseHandling значение по умолчанию FloatParseHandling.Double В моем случае способ получить правильные результаты:

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

JsonSerializer и JsonSerializerSettings содержат одинаковые настройки.

0 голосов
/ 06 июля 2018

Результатом JObject.Parse("{\"available\":8777.831438322572000}") является double.Второе утверждение приводит к decimal.

. double имеет точность с плавающей запятой, которая не так точна, как decimal.

Обязательное чтение: Зачем плаватьНомера точек могут потерять точность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...