【发布时间】:2018-11-15 08:42:07
【问题描述】:
我需要将一个十进制值编码为 json:999999.99990000005,同时不会丢失精度,也不会将表示更改为字符串。期待{ "prc" : 999999.99990000005 }
来自 [this post][1] 我有这个代码。
import json
import decimal
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return str(o)
return super(DecimalEncoder, self).default(o)
y = { 'prc' : decimal.Decimal('999999.99990000005')}
但它会产生一个字符串
json.dumps(y, cls=DecimalEncoder)
'{"cPrc": "999999.99990000005"}'
在isinstance 中用float(o) 替换str(o) 会截断数字。
有什么方法可以获得非字符串结果?
附言我不能使用任何像 simplejson 这样的外部模块。
编辑: 如果我将值保留为字符串,则以下也会产生一个字符串。
>>> x = json.loads("""{ "cPrc" : "999999.99990000005" }""", parse_float=decimal.Decimal)
>>> x
{'cPrc': '999999.99990000005'}
【问题讨论】:
-
您确定要这样做吗?在读取 JSON 时,您几乎肯定会失去这种精度,因为大多数库会将其作为浮点数引入。
-
字符串结果有什么问题?为什么你不能使用它?
-
请参阅问题中的编辑,了解为什么我不能保留字符串。
-
@Steve 你说你不能使用像 simplejson 这样的外部模块,所以我假设你知道 simplejson 会免费编码/解码十进制值,对吧?
-
它序列化为一个字符串,因为您所需的精度水平高于 JSON 支持的基本数据类型所能处理的任何水平。您可能想要做的是将其序列化为当前正在执行的字符串,然后调整 反序列化 过程以将其作为小数处理