[英]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.