2010-01-07 21 views
7

Các // "phân chia số nguyên" nhà điều hành của Python làm tôi ngạc nhiên, hôm nay:Phân tách số nguyên so với thương số được chia sàn: tại sao kết quả đáng ngạc nhiên này lại xảy ra?

>>> math.floor(11/1.1) 
10.0 
>>> 11//1.1 
9.0 

Các documentation đọc "(rối trí) thương của x và y". Vậy, tại sao math.floor (11/1.1) bằng 10, nhưng 11 // 1.1 bằng 9?

+5

http://mail.python.org/pipermail/python-dev/2007-January/070707.html – miku

+0

Câu hỏi kinh điển cho sự khác biệt phân chia Python 2-vs-3 là [Làm thế nào tôi có thể buộc phân chia là dấu phẩy động bằng Python? Sư đoàn tiếp tục làm tròn xuống 0] (https://stackoverflow.com/questions/1267869/how-can-i-force-division-to-be-floating-point-in-python-division-keeps-rounding) – smci

Trả lời

5

Vì 1.1 không thể được biểu diễn chính xác dưới dạng nhị phân; xấp xỉ là một littler cao hơn 1,1 - do đó kết quả phân chia là một chút quá nhỏ.

Hãy thử như sau:

Dưới Python 2, gõ vào console:

>>> 1.1 
1.1000000000000001 

Trong Python 3.1, giao diện điều khiển sẽ hiển thị 1.1, nhưng trong nội bộ, nó vẫn còn cùng một số.

Nhưng:

>>> 11/1.1 
10.0 

Như gnibbler chỉ ra, đây là kết quả của "làm tròn nội bộ" trong giới hạn chính xác có sẵn phao. Và như MYYN chỉ ra trong bình luận của mình, // sử dụng một thuật toán khác để tính toán kết quả phân chia sàn so với math.floor() để bảo toàn a == (a//b)*b + a%b cũng như có thể.

Sử dụng loại Decimal nếu bạn cần độ chính xác này.

+0

Nhưng theo Python '11.0/1.1 == 10.0' là đúng – sth

+1

Như chúng ta đã biết 1.1 được lưu trữ là 1.1000000000000001, do đó kết quả 11.0/1.1 trong Python là 9.999999999999999090909090909 nhưng float gần nhất với số này là infact 10.0, do đó kết quả sẽ xảy ra chính xác là 10.0 –

+0

@Tim Tôi nghĩ về điều đó, và tôi tin rằng đây là chìa khóa cho sự khác biệt giữa math.floor (11/1.1) và 11 // 1.1. Tuy nhiên, như gnibbler chỉ ra, thực tế là 1,1 được đại diện bởi một số lớn hơn một chút chỉ cho thấy rằng math.floor (11/1.1) thực sự là 9.0, mà lá câu hỏi ban đầu vẫn mở. – EOL

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