2015-01-05 57 views
5

考慮小數點以下四捨五入的方法蟒蛇小數量化VS PREC上下文

>>> (Decimal('1')/Decimal('3')).quantize(Decimal('0.00'), rounding=ROUND_HALF_UP) 
Decimal('0.33') 

使用上下文:

>>> ctx = Context(prec=2, rounding=ROUND_HALF_UP) 
>>> setcontext(ctx) 
>>> Decimal('1')/Decimal('3') 
Decimal('0.33') 

是否有2之間的實際差異四捨五入方法?任何陷阱?是否使用上下文更加優雅,以便我可以在整個計算塊中使用with語句?

回答

0
>>> from decimal import Decimal, ROUND_HALF_UP, setcontext, Context 
>>> ctx = Context(prec=2, rounding=ROUND_HALF_UP) 
>>> setcontext(ctx) 
>>> total = Decimal('0.002') + Decimal('0.002') 
>>> total 
Decimal('0.004') 

它實際上並不像我所預期的那樣自動四捨五入,所以我不能將它用於整個計算塊。

另一個問題是,臨時值會被舍入,導致精度下降。

from decimal import Decimal, ROUND_HALF_UP, getcontext, setcontext, Context 

class FinanceContext: 
    def __enter__(self): 
     self.old_ctx = getcontext() 
     ctx = Context(prec=2, rounding=ROUND_HALF_UP) 
     setcontext(ctx) 
     return ctx 

    def __exit__(self, type, value, traceback): 
     setcontext(self.old_ctx) 


class Cart(object): 
    @property 
    def calculation(self): 
     with FinanceContext(): 
      interim_value = Decimal('1')/Decimal('3') 
      print interim_value, "prints 0.33, lost precision due to new context" 

      # complex calculation using interim_value 
      final_result = ... 
      return final_result 
+0

您應該添加此作爲您的問題的一部分,因爲它不是一個真正的答案。 –

+0

我修改了這個答案,它回答了我的一個問題。 –

+0

嗨@JamesLin你能向我解釋ROUND_HALF_UP標誌嗎? – aldesabido