在python json.dumps输出中禁用科学计数法
作者:互联网
json.dumps使用科学计数法输出较小的浮点或十进制值,这对于将输出发送到的json-rpc应用程序是不可接受的.
>>> import json
>>> json.dumps({"x": 0.0000001})
'{"x": 1e-07}'
我想要此输出:
'{"x": 0.0000001}'
避免引入其他依赖关系将是理想的.
解决方法:
格式化的一种方法
evil = {"x": 0.00000000001}
是要窃取Decimal的“ f”格式器.这是我发现的唯一避免裁切问题和指数的简单方法,但是空间效率不高.
class FancyFloat(float):
def __repr__(self):
return format(Decimal(self), "f")
要使用它,您可以制作一个使输入“小数”化的编码器
class JsonRpcEncoder(json.JSONEncoder):
def decimalize(self, val):
if isinstance(val, dict):
return {k:self.decimalize(v) for k,v in val.items()}
if isinstance(val, (list, tuple)):
return type(val)(self.decimalize(v) for v in val)
if isinstance(val, float):
return FancyFloat(val)
return val
def encode(self, val):
return super().encode(self.decimalize(val))
JsonRpcEncoder().encode(evil)
#>>> '{"x": 0.00000000000999999999999999939496969281939810930172340963650867706746794283390045166015625}'
或者,当然,您可以将小数部分移到一个函数中,并在json.dumps之前调用它.
即使那是一种method脚的方法,我也是那样做的.
标签:scientific-notation,python,json 来源: https://codeday.me/bug/20191011/1890810.html