Извлечение числового значения из десятичного числа Python - PullRequest
6 голосов
/ 16 февраля 2010

Когда я использую десятичный объект python просто с чем-то вроде:

from decimal import *
dec = Decimal('3.432')
print dec

он напечатает 3.432, как я хочу, но если я попытаюсь поместить то же значение dec в объект json, то получаю в json значение Decimal («3.432»). Как я могу просто получить числовое значение из десятичного числа?

Ответы [ 5 ]

5 голосов
/ 16 февраля 2010
>>> str(decimal.Decimal('3.1'))
'3.1'

В готовом виде JSON активно использует несколько примитивных типов, таких как строки.

Лучше всего конвертировать десятичные числа в строки при создании документа JSON из какого-либо объекта Python.

Преобразовать строки обратно в десятичные при преобразовании документа JSON обратно в объект Python.

4 голосов
/ 16 февраля 2010

Вы получаете Decimal('3.432') в вашем объекте JSON? Странно ... как?

>>> from decimal import *
>>> import json
>>> json.dumps(Decimal('3.432'))
....
TypeError: Decimal('3.432') is not JSON serializable

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

>>> j = json.dumps(str(Decimal('3.000')))
>>> j
'"3.000"'
>>> Decimal(json.loads(j))
Decimal('3.000')

Конечно, если вам не очень важна точность (например, если какая-то библиотечная процедура дает вам десятичное число), просто сначала конвертируйте в число с плавающей точкой, поскольку JSON может с этим справиться. Вы по-прежнему не получите десятичную запятую позже, если вы снова не преобразуете вручную из числа с плавающей запятой ...

Редактировать: Девин Жанпьер указывает на существующую поддержку в модуле json для декодирования строк с плавающей точкой как что-то отличное от float с аргументом parse_float для load(), loads() и пользовательские JSONDecoders. Хотя для этого потребуется сначала преобразовать ваши десятичные числа в числа с плавающей точкой при кодировании (теряя точность), это может решить вторую половину проблемы чуть более чисто, чем мой более ручной подход, приведенный выше (обратите внимание, что он будет применяться ко всем числам с плавающей точкой в ​​ваших данных JSON). ). Вы также должны иметь возможность создать подкласс JSONEncoder , чтобы записывать цифры для десятичного числа без предварительного преобразования в число с плавающей точкой, что позволит вам избежать потери точности.

1 голос
/ 16 февраля 2010

Интересно - что я получаю, это исключение TypeError (это со стандартным модулем Python 2.6 json - что вы используете?).

Очевидная альтернатива имеет очевидные недостатки:

>>> json.dumps(float(x))
'3.4319999999999999'
>>> json.dumps(str(x))
'"3.432"'

... один может дать вам довольно грязное приближение, другой седлает вас кавычками. Если какая-либо из этих проблем приемлема в вашем приложении, продолжайте, но ни одна из них не соответствует вашей точной спецификации, как изложено.

Самый простой (но не самый чистый !!!) способ сделать то, что вы хотите с помощью json, - это сделать обезьяны:

>>> json.encoder.FLOAT_REPR=str
>>> json.dumps(float(x))
'3.432'

Правильный / чистый способ - создать (и использовать ;-) подкласс json.Encoder, который использует str вместо repr на поплавках - но это, увы, нетривиальный объем работы.

0 голосов
/ 21 сентября 2018

Вы можете преобразовать десятичный объект в строку, а затем строку в десятичную

`>>> a = десятичный. Десятичный (3.0)

>>> ул (а)

3 '

>>> int (str (a))

3 `

0 голосов
/ 23 августа 2016

Просто преобразуйте десятичную строку в float. Нет необходимости использовать Decimal.

>>> dec = float('3.432')
>>> dec
3.432

Объект Float является сериализуемым в формате JSON. Тебе не нужно обходиться.

...