0

我有一個python十進制(貨幣數量),我想四捨五入到小數點後兩位。我嘗試使用常規round()函數來執行此操作。不幸的是,這將返回一個浮動,這使得它不可靠繼續:如何將Python十進制數舍入到2位小數?

>>> from decimal import Decimal 
>>> a = Decimal('1.23456789') 
>>> type(round(a, 2)) 
<type 'float'> 

小數模塊中,我看到有關幾件事情要四捨五入:

  • ROUND_05UP
  • ROUND_CEILING
  • ROUND_DOWN
  • ROUND_FLOOR
  • ROUND_HALF_DOWN
  • ROUND_HALF_EVEN
  • ROUND_HALF_UP
  • ROUND_UP
  • 圓角

我認爲這些都不實際上給我想要什麼,但(或我錯了嗎?)。

所以我的問題:是否有人知道我如何可靠地將Python Decimal舍入到2個小數位,以便我有一個Decimal繼續?歡迎所有提示!

+1

不可能將其使用整數(美分而不是美元)更有意義?這也會更快。 –

+0

設置十進制數的精度:'decimal.getcontext()。prec = 2'。 – ooga

+1

@ooga:處理有效位數,而不是小數位數,因此是不合適的(它會將'12345678'變成'1.2E + 7',但只能在計算後進行計算,而不是在定義之後) 。 –

回答

8

您可以使用quantize() method

>>> import decimal 
>>> decimal.getcontext().prec = 20 
>>> a = decimal.Decimal(321.12345) 
>>> a 
Decimal('321.12344999999999117790139280259609222412109375') 
>>> TWO_PLACES = decimal.Decimal("0.01") 
>>> a.quantize(TWO_PLACES) 
Decimal('321.12') 
0

這已經來到我的腦海:

Decimal(str(round(a, 2))) 

,但我不知道它是多麼快。

0

你嘗試的第一個對我來說工作得很好。

import decimal 

type(round(decimal.Decimal('1.23456789'),2)) 

<class 'decimal.Decimal'>

1

如果使用Jupyter筆記本電腦,只需添加的神奇功能%precision 2 2小數等等。

但是,如果你的價值觀不float()類型,那麼您可以使用下列內容:

from decimal import getcontext, Decimal 
getcontext().prec = 2 
# for example, take integer value 
mynum = 2 
type(mynum) # Int 
print round(Decimal(mynum), 2) # 10.0