2017-08-31 64 views
0

我使用Python進行編程,然後使用Gurobi來解決我的優化問題。作爲我的代碼的一部分,我從文本文件(稱爲「Feed2」)中讀取數據,然後對其進行一些計算。Python中的小數點

with open('Feed2.txt', 'r') as Fee: 

    for i in range(C): 
     Feed= Fee.readline() 
     for s in L11: 
      A[i,s]=float(Feed) 
     for s in L12: 
      A[i,s] =float(Feed)*1.28 
     for s in L13: 
      A[i,s] =float(Feed)*0.95 

print A 

結果顯示一些數字有很多數字的小數點後(如106.51209999999999或1029.4144000000001),這對於Gurobi包裝箱問題了讀取所有那些不是真正有用的數字給我。所以,我想將整個程序的小數點後的位數設置爲5,我遵循https://docs.python.org/3/library/decimal.html(代碼如下)中所述的方法;但沒有什麼改變。

from decimal import * 

getcontext().prec = 5 
+1

我覺得'decimal'僅影響創建號碼設置該包,而不是普通的「浮動」號碼。此外,這只是浮點數如何在內存中表示的一個假象。這真的是一個問題嗎? –

+0

可能的重複[如何格式化小數以始終顯示2個小數位?](https://stackoverflow.com/questions/1995615/how-can-i-format-a-decimal-to-always-show- 2位小數) –

+0

謝謝,,; Gurobi在閱讀這些數字來解決優化問題時遇到了問題。這增加了接近一天以上的計算時間和精度,意味着以零間隙達到最佳解決方案。 – David

回答

2

用於decimal module的文檔提供一個解釋:

不像基於硬件的二進制浮點,十進制模塊具有用戶可改變精度(默認爲28處),其可大根據給定問題的需要。

當你這樣做:

from decimal import * 
getcontext().prec = 5 

你只改變了與來自小數模塊Decimal對象使用精度。您沒有更改Python內置浮點數的精度。

正如評論中所說,您所遇到的行爲並不新鮮。這只是浮點數被存儲在內存中的一種副作用。如果您真的需要浮標來保持特定的精度,請使用decimal.Decimal類。例如:

>>> from decimal import Decimal 
>>> Decimal.from_float(0.1) 
Decimal('0.1000000000000000055511151231257827021181583404541015625') 
>>> Decimal('0.1') 
Decimal('0.1') 
>>> Decimal('0.1')/Decimal('0.5') 
Decimal('0.2') 

如果你只需要到小數點四捨五入到一個特異性的精度才能正常顯示,格式使用str.format

'{:<number of digits before decimal>.<number of digits after decimal >f}'.format(float) 

或用舊樣式格式:

'%<number of digits before decimal>.<number of digits after decimal >f' % (float) 

推薦閱讀:What Every Computer Scientist Should Know About Floating-Point Arithmetic

0

如果你只是需要與打印數字,例如,只有兩個小數:

print "%.2f" % (A,) 

或較新的

print "{0:.2f}".format(A)