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!
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
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
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