2015-11-26 20 views
0

我進行了一個簡單的歸一化處理:不帶小數點的字和不浮充轉換打印十進制數

a = range(5) 
norm = [Decimal(i)/sum(a) for i in a] 
print norm 

輸出:

[Decimal('0'), Decimal('0.1'), Decimal('0.2'), Decimal('0.3'), Decimal('0.4')] 

但我只是希望它打印:

[0, 0.1, 0.2, 0.3, 0.4] 

我該如何糾正?請幫忙。 PS:這只是我嘗試過的一個例子。我的實際數據有很大的浮點數。我想這樣做以避免浮點錯誤。我想要的結果是小數,而不是浮動。

回答

1

使用打印,而不是打印(STR(十進制))(十進制):

print [str(i) for i in norm] 
['0', '0.1', '0.2', '0.3', '0.4'] 
1

打印小數沒有 '十進制' 出現,你可以繼承十進制和覆蓋​​__repr__

>>> class MyDecimal(Decimal): 
... def __repr__(self): 
...  return str(float(self)) 
... 
>>> x = Decimal(4.1) 
>>> x 
Decimal('4.0999999999999996447286321199499070644378662109375') 
>>> y = MyDecimal(5.3) 
>>> y 
5.3 

但是,當您對它們進行任何操作時,repr會回到它的原始形式:

>>> y = MyDecimal(5.3) 
>>> z = MyDecimal(4.2) 
>>> y + z 
Decimal('9.500000000000000000000000000') 

在這種情況下總是得到MyDecimal,您需要覆蓋Decimal的所有操作,以返回MyDecimal對象而不是Decimal

請注意,我們在這裏看到的是小數的表示形式。你需要在做其他操作時保持原樣。或者在其他地方使用時始終轉換爲浮動。 From the docs

小數對象一般不能與漂浮在算術運算組合:嘗試一個十進制添加到浮動,例如,將提高一個TypeError。這條規則有一個例外:可以使用Python的比較運算符來比較float實例x和Decimal實例y。如果沒有這種例外情況,Decimal和float實例之間的比較將遵循通用規則來比較參考手冊的「表達式」部分中描述的不同類型的對象,從而導致混淆結果。

相關問題