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