Cách trực tiếp nhất để có những trần của một trường hợp Decimal x
là sử dụng x.to_integral_exact(rounding=ROUND_CEILING)
. Không cần phải gây rối với bối cảnh ở đây. Lưu ý rằng điều này đặt các cờ Inexact
và Rounded
khi thích hợp; nếu bạn không muốn chạm cờ, hãy sử dụng x.to_integral_value(rounding=ROUND_CEILING)
để thay thế. Ví dụ:
>>> from decimal import Decimal, ROUND_CEILING
>>> x = Decimal('-123.456')
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')
Không giống như hầu hết các phương pháp số thập phân, các to_integral_exact
và to_integral_value
phương pháp này không bị ảnh hưởng bởi độ chính xác của bối cảnh hiện nay, vì vậy bạn không cần phải lo lắng về việc thay đổi chính xác:
>>> from decimal import getcontext
>>> getcontext().prec = 2
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')
Nhân tiện, trong Python 3.x, math.ceil
hoạt động chính xác như bạn muốn, ngoại trừ việc nó trả về int
thay vì một ví dụ Decimal
. Điều đó hoạt động vì math.ceil
có thể quá tải đối với các kiểu tùy chỉnh trong Python 3. Trong Python 2, math.ceil
chỉ cần chuyển đổi cá thể Decimal
thành float
trước tiên, có khả năng mất thông tin trong quá trình, để bạn có thể kết quả không chính xác.
Nguồn
2010-05-09 09:58:07
Tôi mới bắt đầu với python, chỉ mới bắt đầu vào ngày hôm qua. Stumbled khi vấn đề này trong chương trình thực hành thứ hai của tôi (đầu tiên là tất nhiên bắt buộc "in" Hello, World! '; "). vì vậy, tôi thấy khó khăn để đánh giá câu trả lời tốt nhất cho điều này. Giải pháp decimal.Context của Matthew Flaschen đã làm việc trong trường hợp cụ thể của tôi. Nhưng tôi muốn những người khác đề cao giải pháp tốt nhất (cũng sẽ hữu ích cho những người mới như tôi có thể giải thích tại sao một phương pháp nào đó hoạt động tốt hơn) và tôi sẽ quay lại và chấp nhận. – Gunjan