繁体   English   中英

Python:在json中强制浮点数的精度?

[英]Python: forcing precision on a floating point number in json?

(更新)

这是我看到的实际问题。 请注意,round()似乎没有做到这一点。

这是我的代码:

t0=time.time()
# stuff
t1=time.time()
perfdat={'et1' : round(t1-t0,6), 'et2': '%.6f'%(t1-t0)}

而dict和json输出分别为:

{'et2': '0.010214', 'et1': 0.010214000000000001}

{"et2":"0.010214","et1":0.010214000000000001}

(最后更新)

我有一个浮点值,它有很多额外的精度数字,我不需要。 有没有办法在格式化json字符串时截断这些数字?

如果我将值格式化为字符串,我可以得到我需要的截断,但我想将值作为(截断的)数字传输。

import json
v=2.030000002

json.dumps({'x':v})     # would like to just have 2.030
'{"x": 2.030000002}'

s= '%.3f' % (v)         # like this, but not as a string
json.dumps({'x' : s})
'{"x": "2.030"}'

将数字包装到float

>>> s = float('%.3f' % (v))
>>> json.dumps({'x' : s})
{"x": 2.03}

以下方法似乎很有希望:

import json

v = 2.030000002
result = []
for part in json.JSONEncoder().iterencode({'x': v}):
    try:
        tmp = round(float(part), 3)
    except ValueError:
        pass
    else:
        part = '{:.3f}'.format(tmp)
    result.append(part)
result = ''.join(result)

print result  # -> {"x": 2.030}

内置功能round可以提供帮助

In [16]: v=2.030000002

In [17]: json.dumps({'x': round(v, 3)})
Out[17]: '{"x": 2.03}'

这是我从Python标准库中找到的东西:

“与基于硬件的二进制浮点不同,十进制模块具有用户可更改的精度(默认为28位),这可以与给定问题所需的一样大:

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')

更好的进口声明是:

from decimal import getcontext, Decimal

然后,您可以应用这些相同的函数来指定任意精度。 希望这可以帮助! 我以前没用过这个。

对于你的情况:(仍有零尾问题)

getcontext().prec = 3
s = '2.030'
var = float(Decimal(s))

var返回2.03

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM