Skip to main content
 首页 » 编程设计

python之格式 float 与标准 json 模块

2025年05月04日12leader

我使用的是标准 json module在 python 2.6 中序列化 float 列表。但是,我得到的结果是这样的:

>>> import json 
>>> json.dumps([23.67, 23.97, 23.87]) 
'[23.670000000000002, 23.969999999999999, 23.870000000000001]' 

我希望 float 的格式只包含两位小数。输出应如下所示:

>>> json.dumps([23.67, 23.97, 23.87]) 
'[23.67, 23.97, 23.87]' 

我已经尝试定义我自己的 JSON 编码器类:

class MyEncoder(json.JSONEncoder): 
    def encode(self, obj): 
        if isinstance(obj, float): 
            return format(obj, '.2f') 
        return json.JSONEncoder.encode(self, obj) 

这适用于唯一的 float 对象:

>>> json.dumps(23.67, cls=MyEncoder) 
'23.67' 

但嵌套对象失败:

>>> json.dumps([23.67, 23.97, 23.87]) 
'[23.670000000000002, 23.969999999999999, 23.870000000000001]' 

我不想有外部依赖,所以我更愿意坚持使用标准的 json 模块。

我怎样才能做到这一点?

请您参考如下方法:

注意:这在任何最新版本的 Python 中都不有效。

不幸的是,我相信你必须通过猴子补丁来做到这一点(在我看来,这表明标准库 json 包中存在设计缺陷)。例如,这段代码:

import json 
from json import encoder 
encoder.FLOAT_REPR = lambda o: format(o, '.2f') 
     
print(json.dumps(23.67)) 
print(json.dumps([23.67, 23.97, 23.87])) 

发出:

23.67 
[23.67, 23.97, 23.87] 

如你所愿。显然,应该有一种体系结构的方法来覆盖 FLOAT_REPR,这样如果您愿意, float 的每个表示都在您的控制之下;但不幸的是,json 包不是这样设计的。