2015-01-05 9 views
5

Considerare i seguenti approcci di arrotondamento in decimali:pitone decimale quantizzazione vs prec nel contesto

utilizzando quantizzazione:

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

utilizzando contesto:

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

Ci sono differenze effettive tra il 2 metodi per arrotondare? Qualche trucco? Il contesto è un po 'più elegante, quindi posso usare l'istruzione with per l'intero blocco di calcolo?

risposta

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

In effetti non tutto automaticamente come avrei aspettato, quindi non sarà in grado di utilizzare tale per l'intero blocco di calcolo.

Un altro problema, i valori intermedi sono arrotondati che perde precisione.

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

Probabilmente dovresti aggiungere questo come parte della tua domanda, poiché non è proprio una risposta. –

+0

Ho modificato questa risposta, risponde a una delle mie domande. –

+0

Ciao @JamesLin potresti spiegarmi la bandiera ROUND_HALF_UP? – aldesabido

Problemi correlati