Python JSON parse_float=decimal.Decimal不工作

ufj5ltwl  于 2023-03-31  发布在  Python
关注(0)|答案(3)|浏览(132)

我有一个包含浮点数的字符串,但我无法让JSON将其加载为十进制。

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

这将返回:

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

你知道我怎样才能把它变成真正的“4.59”吗?

oyxsuwqo

oyxsuwqo1#

我们需要定义一个函数来执行任何需要的舍入,然后使用修改后的字符串来构建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']}
>>>
jmo0nnb3

jmo0nnb32#

你不能。这个数字不是4.59,它是4.58999999999999999,就json解析器所知。你需要添加一些更复杂的逻辑来对这样的数字进行舍入,作为decimal.Decimal的 Package 器。

0mkxixxg

0mkxixxg3#

我知道这是十多年后的事了,但为了让任何人都能像我在谷歌上一样看到Alex Martin的答案,我们可以简化他的函数:

json.loads(x, parse_float=lambda x: round(decimal.Decimal(x),2))

原因是传入parse_float的值已经是一个str。而且,这段代码不会像他那样在64位处截断输入值(首先解析为浮点数将在64位精度处截断)。
显然,你也可以使用一个函数而不是lambda。

相关问题