我有一个包含浮点数的字符串,但我无法让JSON将其加载为十进制。
x = u'{"14": [4.5899999999999999, "susan"]}' json.loads(x, parse_float = decimal.Decimal)
这将返回:
{u'14': [Decimal('4.5899999999999999'), u'susan']}
你知道我怎样才能把它变成真正的“4.59”吗?
oyxsuwqo1#
我们需要定义一个函数来执行任何需要的舍入,然后使用修改后的字符串来构建Decimal。它只是做你告诉它的事情,也就是说,使用整个字符串,而不是你想要的(并且没有告诉代码或我们;- ).例如:
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']} >>>
jmo0nnb32#
你不能。这个数字不是4.59,它是4.58999999999999999,就json解析器所知。你需要添加一些更复杂的逻辑来对这样的数字进行舍入,作为decimal.Decimal的 Package 器。
0mkxixxg3#
我知道这是十多年后的事了,但为了让任何人都能像我在谷歌上一样看到Alex Martin的答案,我们可以简化他的函数:
json.loads(x, parse_float=lambda x: round(decimal.Decimal(x),2))
原因是传入parse_float的值已经是一个str。而且,这段代码不会像他那样在64位处截断输入值(首先解析为浮点数将在64位精度处截断)。显然,你也可以使用一个函数而不是lambda。
parse_float
str
3条答案
按热度按时间oyxsuwqo1#
我们需要定义一个函数来执行任何需要的舍入,然后使用修改后的字符串来构建
Decimal
。它只是做你告诉它的事情,也就是说,使用整个字符串,而不是你想要的(并且没有告诉代码或我们;- ).例如:
jmo0nnb32#
你不能。这个数字不是4.59,它是4.58999999999999999,就json解析器所知。你需要添加一些更复杂的逻辑来对这样的数字进行舍入,作为decimal.Decimal的 Package 器。
0mkxixxg3#
我知道这是十多年后的事了,但为了让任何人都能像我在谷歌上一样看到Alex Martin的答案,我们可以简化他的函数:
原因是传入
parse_float
的值已经是一个str
。而且,这段代码不会像他那样在64位处截断输入值(首先解析为浮点数将在64位精度处截断)。显然,你也可以使用一个函数而不是lambda。