2012-03-10 16 views
9

Tôi đang cố gắng đọc dữ liệu tài chính và lưu trữ nó. Nơi tôi nhận được các dữ liệu tài chính từ các cửa hàng dữ liệu với độ chính xác đáng kinh ngạc, tuy nhiên tôi chỉ quan tâm đến 5 con số sau dấu thập phân. Vì vậy, tôi đã quyết định sử dụng t = .quantize (cdecimal.Decimal ('. 00001'), rounding = cdecimal.ROUND_UP) trên Decimal I create, nhưng tôi tiếp tục nhận được một ngoại lệ InvalidOperation. Tại sao điều này?Python cdecimal InvalidOperation

>>> import cdecimal 
>>> c = cdecimal.getcontext() 
>>> c.prec = 5 
>>> s = '45.2091000080109' 
>>> # s = '0.257585003972054' works! 
>>> t = cdecimal.Decimal(s).quantize(cdecimal.Decimal('.00001'), rounding=cdecimal.ROUND_UP) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    cdecimal.InvalidOperation: [<class 'cdecimal.InvalidOperation'>] 

Tại sao có hoạt động không hợp lệ ở đây? Nếu tôi thay đổi độ chính xác thành 7 (hoặc lớn hơn), nó hoạt động. Nếu tôi đặt s là '0.257585003972054' thay vì giá trị ban đầu, điều đó cũng hoạt động! Chuyện gì vậy?

Cảm ơn!

Trả lời

12

phiên bản số thập phân cho một mô tả rõ hơn về lỗi:

Python 2.7.2+ (default, Feb 16 2012, 18:47:58) 
>>> import decimal 
>>> s = '45.2091000080109' 
>>> decimal.getcontext().prec = 5 
>>> decimal.Decimal(s).quantize(decimal.Decimal('.00001'), rounding=decimal.ROUND_UP) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/decimal.py", line 2464, in quantize 
    'quantize result has too many digits for current context') 
    File "/usr/lib/python2.7/decimal.py", line 3866, in _raise_error 
    raise error(explanation) 
decimal.InvalidOperation: quantize result has too many digits for current context 
>>> 

Docs:

Unlike other operations, if the length of the coefficient after the quantize operation would be greater than precision, then an InvalidOperation is signaled. This guarantees that, unless there is an error condition, the quantized exponent is always equal to that of the right-hand operand.

Nhưng tôi phải thú nhận tôi không biết điều này có nghĩa.

+12

Vấn đề là ngữ cảnh "trước" không có nghĩa là bạn và/hoặc OP nghĩ điều đó có nghĩa là gì. Đó là tổng độ chính xác, không phải "độ chính xác sau dấu thập phân". 1.2345 có năm chữ số chính xác, và 123.45, nhưng 123.45000 có tám, không phải năm, chữ số chính xác. – torek

+1

cảm ơn - điều đó khiến! có cách nào để đặt độ chính xác sau dấu thập phân cho phép toán phân chia tức là không? – user1094786

+1

Chỉ có .quantize(). Để thực hiện chính xác khoa học-ký hiệu, đó là một nỗi đau nhưng đối với trường hợp của bạn thật dễ dàng, bạn chỉ cần .quantize to .00001. :-) – torek