2015-06-14 22 views
7

Tôi nghĩ rằng có một số mâu thuẫn trong hoạt động phân chia, nhưng tôi không chắc chắn.Kết quả phân chia kỳ lạ trong python 3

Trong đoạn mã sau, tôi sẽ mong đợi một // c là 100.0 hoặc b // c là -99.0.

a = 1.0 
b = -1.0 
c = 0.01 

print (a/c) 
print (a//c) 
print (b/c) 
print (b//c) 

cho:

100.0 
99.0 
-100.0 
-100.0 

Cảm ơn

Trả lời

3

Đây là do cách floating point numbers are represented. Không đúng là 1.0 chính xác là 100 lần 0.01 (theo như các điểm nổi được thể hiện bên trong). Nhà điều hành // thực hiện phân chia và chia sàn kết quả sao cho có thể số nội bộ nhỏ hơn một chút so với 100.0 và điều này dẫn đến việc chia sàn thành 99.0.

Hơn nữa, Python 3.x sử dụng a different approach để hiển thị cho bạn số dấu phẩy động so với Python 2.x. Điều này có nghĩa là kết quả của 1.0/0.01, mặc dù nội bộ hơi nhỏ hơn 100.0, sẽ được hiển thị cho bạn dưới dạng 100.0 vì thuật toán xác định rằng số đó đủ gần để 100.0 được xem là bằng 100.0. Đây là lý do tại sao 1.0/0.01 được hiển thị cho bạn dưới dạng 100.0 mặc dù điều này có thể không được biểu thị nội bộ chính xác như số đó.

+0

Cảm ơn câu trả lời chi tiết. Mặc dù logic là rõ ràng - hành vi này là gây hiểu lầm trong một hoạt động trực quan như vậy. – Baba

+0

@Baba: có lẽ nhưng đây là một trong những cảnh báo về việc sử dụng các số dấu phẩy động. Có nhiều cách hơn số dấu chấm động so với một máy tính có thể hy vọng thể hiện chính xác vì vậy đây là điều cần lưu ý khi sử dụng các số dấu phẩy động. –

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