Python JSON parse_float = десятичный. Десятичный не работает - PullRequest
0 голосов
/ 26 ноября 2009

У меня есть строка с числом с плавающей запятой, но я не могу заставить JSON загрузить ее как десятичное число.

x = u'{"14": [4.5899999999999999, "susan"]}'
json.loads(x, parse_float = decimal.Decimal)

Возвращает:

{u'14': [Decimal('4.5899999999999999'), u'susan']}

Есть идеи, как я могу превратить это в настоящий "4,59"?

Ответы [ 2 ]

8 голосов
/ 26 ноября 2009

Вам необходимо определить функцию, которая будет выполнять любое округление, которое вы хотите, а затем использовать измененную строку для построения Decimal. Ваше текущее решение работает на отлично: оно просто делает именно то, что вам говорят, то есть использует всю строку, в отличие от того, что вы желаете (и не сказали ни код, ни нас; -).

например:.

>>> def doit(s): return decimal.Decimal(str(round(float(s), 2)))
... 
>>> json.loads(x, parse_float=doit)
{u'14': [Decimal('4.59'), u'susan']}
>>> 
3 голосов
/ 26 ноября 2009

Вы не можете. Это число не 4,59, а 4,589999999999999999, насколько известно анализатору json. Вам нужно было бы добавить более сложную логику, которая округляет такие числа, как обертку вокруг десятичной дроби. Десятичная.

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