在python json.dumps输出中禁用科学计数法

发布于 2021-01-29 16:26:00

json.dumps使用科学计数法输出较小的浮点或十进制值,这对于将输出发送到的json-rpc应用程序是不可接受的。

>>> import json
>>> json.dumps({"x": 0.0000001})
'{"x": 1e-07}'

我想要此输出:

'{"x": 0.0000001}'

避免引入其他依赖关系将是理想的。

关注者
0
被浏览
186
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    格式化的一种方法

    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

    即使这是一种la脚的方法,我也是这样做的。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看