Python JSON parse_float=decimal.Decimal 不起作用
我有一个字符串,里面有一个浮点数,但我无法让JSON把它当作小数来加载。
x = u'{"14": [4.5899999999999999, "susan"]}'
json.loads(x, parse_float = decimal.Decimal)
这段代码返回了:
{u'14': [Decimal('4.5899999999999999'), u'susan']}
有没有什么办法可以把它变成真正的“4.59”?
3 个回答
2
我知道这已经过去十多年了,但我想稍微完善一下Alex Martin的回答,方便那些像我一样在谷歌上看到这个内容的人。我们可以把他的函数简化成:
json.loads(x, parse_float=lambda x: round(decimal.Decimal(x),2))
原因是,传递给json.loads
的parse_float
函数的值已经是一个str
类型的字符串了。而且,这段代码不会像他那样把输入值截断到64位(先解析成浮点数会在64位精度上截断)。
显然,你也可以使用一个普通的函数,而不是用lambda表达式。我这里用lambda只是为了简洁。
5
你不能这样做。那个数字不是4.59,而是4.589999999999999999,至少在json解析器看来是这样的。你需要添加一些更复杂的逻辑,来处理像这样的数字四舍五入,作为decimal.Decimal的一个包装。
10
你需要定义一个函数,这个函数可以按照你想要的方式进行四舍五入,然后用处理过的字符串来构建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']}
>>>