簡體   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