从Python Decimal中提取数值

时间:2010-02-16 00:31:59

标签: python decimal

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

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

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

5 个答案:

答案 0 :(得分:4)

>>> str(decimal.Decimal('3.1'))
'3.1'

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

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

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

答案 1 :(得分:4)

您的JSON对象中有Decimal('3.432')?奇怪......怎么样?

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

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

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

当然,如果你真的不关心精度(例如,如果某些库例程给你一个Decimal),那么首先转换为float,因为JSON可以处理它。除非你再次从float手动转换,否则你仍然不会得到一个Decimal ...

编辑:Devin Jeanpierre指出json模块中现有的支持,用于将浮点字符串解码为浮点数而不是parse_float argument load()loads()和自定义JSONDecoders。虽然这需要你首先在编码时将你的十进制转换为浮点数(失去精度),但它可以比上面的更多手动方法更清晰地解决问题的后半部分(请注意它将适用于JSON数据中的所有浮点数) )。您还应该能够创建一个JSONEncoder subclass来写出Decimal的数字而不先转换为float,这样可以避免精度的损失。

答案 2 :(得分:1)

有趣 - 我得到的是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 - 但这是一个非常重要的数量工作,唉。

答案 3 :(得分:0)

只需将十进制字符串转换为float即可。无需使用Decimal

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

Float对象是JSON可序列化的。你不必做任何工作。

答案 4 :(得分:0)

您可以将十进制对象转换为字符串,然后将字符串转换为十进制

`>>> a =十进制.Decimal(3.0)

>>> str(a)

'3'

>>> int(str(a))

3 `