从Python Decimal中提取数值

wha*_*hat 6 python decimal

当我使用python Decimal对象时,只需:

from decimal import *
dec = Decimal('3.432')
print dec
Run Code Online (Sandbox Code Playgroud)

它将打印3.432,就像我想要的那样,但如果我尝试将相同的值dec放入json对象中,我在json中得到的是Decimal("3.432").我怎样才能从小数中得到数值?

S.L*_*ott 5

>>> str(decimal.Decimal('3.1'))
'3.1'
Run Code Online (Sandbox Code Playgroud)

开箱即用的JSON大量使用了一些原始类型,例如字符串。

从某些Python对象创建JSON文档时,最好的选择是将Decimals转换为字符串。

将JSON文档转换回Python对象时,将字符串转换回Decimal。


Pet*_*sen 5

Decimal('3.432')在你的 JSON 对象中得到了一个?奇怪……怎么办?

>>> from decimal import *
>>> import json
>>> json.dumps(Decimal('3.432'))
....
TypeError: Decimal('3.432') is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

在任何情况下,如果您使用的是 Decimal 而不是浮点数,您可能不想通过将其转换为浮点数而失去精度。如果这是真的,那么您必须首先确保保留所有数据并处理 JSON 不理解 Decimal 类型的事实,从而自己管理该过程:

>>> j = json.dumps(str(Decimal('3.000')))
>>> j
'"3.000"'
>>> Decimal(json.loads(j))
Decimal('3.000')
Run Code Online (Sandbox Code Playgroud)

当然,如果您并不真正关心精度(例如,如果某些库例程给您一个 Decimal),只需先转换为浮点数,因为 JSON 可以处理。除非您再次从浮点数手动转换,否则您以后仍然不会得到小数...

编辑:德文Jeanpierre指出在现有支持json模块浮法字符串作为比浮动与其他一些解码parse_float参数load()loads()和自定义JSONDecoders。虽然这需要您在编码时首先将小数转换为浮点数(失去精度),但它可以比我上面的手动方法更干净地解决问题的后半部分(请注意,它将适用于您的 JSON 数据中的所有浮点数)。您还应该能够创建一个JSONEncoder 子类来写出 Decimal 的数字,而无需先转换为浮点数,这样可以避免精度损失。