2015-01-05 12 views
5

ondalık aşağıdaki yuvarlama yaklaşımları düşününpiton ondalık quantize

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

bağlamını kullanarak:

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

2 arasında herhangi bir fiili farklılıklar var mı yuvarlama yöntemleri? Herhangi bir şey var mı? Tüm hesaplama bloğu için with ifadesini kullanabilmem için bağlamı biraz daha zarif kullanıyor muyum?

cevap

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') 

Aslında beklediğim gibi otomatik olarak dönmüyor, bu yüzden tüm hesaplama bloğu için kullanamayacağım.

Diğer bir sorun, ara değerlerin doğruluğunu yitirmesiyle sonuçlanan yuvarlar.

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

Sorunu bir parçası olarak eklemelisiniz, çünkü gerçekten bir yanıt değil. –

+0

Bu cevabı değiştirdim, sorumu yanıtlıyor. –

+0

Merhaba @JamesLin, bana ROUND_HALF_UP bayrağını açıklar mısınız? – aldesabido