相关疑难解决方法(0)

格式浮动标准json模块

我在python 2.6中使用标准的json模块来序列化浮点数列表.但是,我得到的结果如下:

>>> import json
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'
Run Code Online (Sandbox Code Playgroud)

我希望浮点数只用两位小数进行格式化.输出应如下所示:

>>> json.dumps([23.67, 23.97, 23.87])
'[23.67, 23.97, 23.87]'
Run Code Online (Sandbox Code Playgroud)

我尝试过定义自己的JSON Encoder类:

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

这适用于唯一的浮动对象:

>>> json.dumps(23.67, cls=MyEncoder)
'23.67'
Run Code Online (Sandbox Code Playgroud)

但嵌套对象失败:

>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'
Run Code Online (Sandbox Code Playgroud)

我不想有外部依赖,所以我更喜欢坚持使用标准的json模块.

我怎样才能做到这一点?

python floating-point formatting json

89
推荐指数
9
解决办法
6万
查看次数

如何设置JSONEncoder生成的浮点数?

我正在尝试设置python json库以保存为包含其他词典元素的字典.有许多浮点数,我想限制位数,例如7.

根据SO中的其他帖子,encoder.FLOAT_REPR如果它不起作用将被使用.

例如,以下在Python3.7.1中运行的代码打印所有数字:

import json
json.encoder.FLOAT_REPR = lambda o: format(o, '.7f' )
d = dict()
d['val'] = 5.78686876876089075543
d['name'] = 'kjbkjbkj'
f = open('test.json', 'w')
json.dump(d, f, indent=4)
f.close()
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

它可能无关紧要,但我在OSX上.

编辑

这个问题被标记为重复.然而,在原始的接受(并且直到现在唯一)答案中,明确说明:

注意:此解决方案不适用于python 3.6+

所以解决方案不合适.此外,它使用的是库simplejson 而不是json.

python floating-point json python-3.x

6
推荐指数
2
解决办法
554
查看次数

标签 统计

floating-point ×2

json ×2

python ×2

formatting ×1

python-3.x ×1