2015-01-05 42 views
5

Xem xét các phương pháp làm tròn sau đây trong số thập phân:python thập phân quantize vs prec trong bối cảnh

sử dụng quantize:

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

sử dụng bối cảnh:

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

Có bất kỳ sự khác biệt thực sự giữa 2 phương pháp làm tròn? Bất kỳ gotchas? Sử dụng ngữ cảnh có thanh lịch hơn một chút để tôi có thể sử dụng câu lệnh with cho toàn bộ khối tính toán không?

Trả lời

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

Thực tế không tròn tự động như tôi mong đợi, vì vậy tôi sẽ không thể sử dụng nó cho toàn bộ khối tính toán.

Một vấn đề khác, giá trị tạm thời được làm tròn làm mất độ chính xác.

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

Bạn có lẽ nên thêm điều này như là một phần của câu hỏi, vì đó không phải là câu trả lời thực sự. –

+0

Tôi đã sửa đổi câu trả lời này, nó trả lời một câu hỏi của tôi. –

+0

Xin chào @ JamesLin bạn có thể giải thích cho tôi cờ ROUND_HALF_UP không? – aldesabido

Các vấn đề liên quan