我在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 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.