Chú ý rằng khi bạn gọi round
bạn đang nhận được một giá trị float do đó, không phải là Decimal
. round
là cố định giá trị cho một phao và sau đó làm tròn rằng theo các quy tắc để làm tròn một phao.
Nếu bạn sử dụng tham số ndigits
tùy chọn khi bạn gọi round()
bạn sẽ nhận được kết quả thập phân và trong trường hợp này nó sẽ làm tròn theo cách bạn mong đợi.
Python 3.4.1 (default, Sep 24 2015, 20:41:10)
[GCC 4.9.2 20150212 (Red Hat 4.9.2-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import decimal
>>> context = decimal.getcontext()
>>> context.rounding = decimal.ROUND_HALF_UP
>>> round(decimal.Decimal('2.5'), 0)
Decimal('3')
tôi đã không tìm thấy nơi nó được ghi chép lại rằng round(someDecimal)
trả về một int nhưng round(someDecimal, ndigits)
trả về một số thập phân, nhưng điều đó có vẻ là những gì xảy ra trong Python 3.3 và sau này. Trong Python 2.7, bạn luôn nhận được một float khi bạn gọi round()
nhưng Python 3.3 đã cải thiện sự tích hợp của Decimal
với các nội trang Python.
Như đã đề cập trong một chú thích, round()
đại biểu Decimal.__round__()
và đó thực sự thể hiện hành vi tương tự:
>>> Decimal('2.5').__round__()
2
>>> Decimal('2.5').__round__(0)
Decimal('3')
Tôi lưu ý rằng các tài liệu cho Fraction
nói:
__round__()
__round__(ndigits)
The first version returns the nearest int to self, rounding half to even.
The second version rounds self to the nearest multiple of Fraction(1, 10**ndigits)
(logically, if ndigits is negative), again rounding half toward even.
This method can also be accessed through the round() function.
Như vậy hành vi này là phù hợp trong đó không có đối số, nó thay đổi loại kết quả và làm tròn một nửa thành thậm chí, tuy nhiên có vẻ như Decimal
không ghi lại hành vi của phương thức __round__
của nó .
Chỉnh sửa để lưu ý như Barry Hurley nói trong phần nhận xét, round()
được ghi lại là trả về int
nếu được gọi không có đối số tùy chọn và "giá trị dấu phẩy động" nếu có đối số tùy chọn. https://docs.python.org/3/library/functions.html#round
Cảm ơn @Duncan vì đã giải thích, bạn nên cố gắng hiểu những điều này. Có vẻ rất kỳ quặc rằng một _type_ khác được trả về tùy thuộc vào việc bạn có chỉ định ndigits hay không. –
Là một add-on, python 3 tài liệu nói rằng nó đại biểu cho 'số .__ vòng __ (ndigits)' và 'thập phân' thực hiện mô-đun có riêng' __round__' phương pháp –
@ Dunca, nó có vẻ là một int, chứ không phải là float mặc dù: "Nếu ndigits bị bỏ qua hoặc là None, nó trả về số nguyên gần nhất cho đầu vào của nó." https://docs.python.org/3/library/functions.html#round –