2016-03-04 131 views
1

爲PythonPython的float精度約小數

a = 1 

for x in range(5): 
    a += 0.1 
    print(a) 

這是結果:

1.1 1.2000000000000002 1.3000000000000003 1.4000000000000004 1.5000000000000004

我怎樣才能用這個處理? round()函數的唯一方法是什麼?我可以在設置值之前設置變量的精度嗎?

回答

3

我可以設置一個變量的精度設定值之前?

使用decimal模塊,不像float(),提供任意精度和能準確地表示十進制數:

>>> from decimal import Decimal, getcontext 
>>> 
>>> getcontext().prec = 5 
>>> 
>>> a = Decimal(1) 
>>> 
>>> for x in range(5): 
...  a += Decimal(0.1) 
...  print(a) 
... 
1.1000 
1.2000 
1.3000 
1.4000 
1.5000 
2

你可以像這樣格式化你的輸出;

a=1 
for x in range(5): 
    a += 0.1 
    print("{:.9f}".format(a)) 
1

假設你的問題是隻顯示號碼,@Jaco的回答做工作。但是,如果您擔心使用該變量並可能進行比較或分配給字典鍵,我會說你必須堅持round()。例如,這是行不通的:

a = 1 
for x in range(5): 
    a += 0.1 
    print('%.1f' % a) 
    if a == 1.3: 
     break 

1.1 
1.2 
1.3 
1.4 
1.5 

你不得不做的事:

a = 1 
for x in range(5): 
    a += 0.1 
    print('%.1f' % a) 
    if round(a, 1) == 1.3: 
     break 

1.1 
1.2 
1.3 
1

格式化輸出已經@Jaco被正式提出。但是,如果您想要控制超出純輸出的變量的精度,則可能需要查看decimal模塊。

from decimal import Decimal 

a = 1 
for x in range(3): 
    a += Decimal('0.10') # use string, not float as argument 
    # a += Decimal('0.1000') 
    print(a) # a is now a Decimal, not a float 

> 1.10 # 1.1000 
> 1.20 # 1.2000 
> 1.30 # 1.3000 
+0

不錯的建議使用字符串作爲'Decimal()'的輸入。不知何故,我錯過了有用的功能。 – Chris

+0

@Chris讀你的答案,我不得不承認,我不知道你可以使用get_context設置一般精度:D我只使用上下文來設置一般的舍入行爲。 – schwobaseggl