Câu trả lời:
Trong Python 3.x, 5 / 2
sẽ trở lại 2.5
và 5 // 2
sẽ trở lại 2
. Cái trước là phân chia điểm trôi nổi, và cái sau là phân chia tầng , đôi khi còn được gọi là phân chia số nguyên .
Trong Python 2.2 trở lên trong dòng 2.x, không có sự khác biệt nào cho các số nguyên trừ khi bạn thực hiện a from __future__ import division
, điều này khiến Python 2.x chấp nhận hành vi 3.x.
Bất kể nhập khẩu trong tương lai, 5.0 // 2
sẽ trở lại 2.0
vì đó là kết quả phân chia sàn của hoạt động.
Bạn có thể tìm thấy một mô tả chi tiết tại https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator
python -Qnew
. các tùy chọn phân chia khác: -Qold
(mặc định) -Qwarn
,,-Qwarnall
5.0 / 2
trả về 2.5
trong tất cả các phiên bản, cũng như vậy 5 / 2.0
- hành vi cũ chỉ khác nhau khi cả hai toán hạng int
.
Để làm rõ cho dòng Python 2.x, /
không phải là phân chia tầng hay phân chia thực sự. Câu trả lời được chấp nhận hiện tại không rõ ràng về điều này.
/
là phân chia sàn khi cả hai đối số là int
, nhưng là phân chia thực sự khi một hoặc cả hai đối số là float
.
Những điều trên cho biết nhiều sự thật hơn, và rõ ràng hơn đoạn 2 trong câu trả lời được chấp nhận.
//
thực hiện "phân chia sàn", bất kể loại của bạn. Vì vậy,
1.0/2.0
sẽ cho 0.5
, nhưng cả hai 1/2
, 1//2
và 1.0//2.0
sẽ cho 0
.
Xem https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator để biết chi tiết
math.floor()
hoặc math.fmod()
nếu bạn không chắc chắn điều gì đang xảy ra với các nhà khai thác đơn nguyên.
/
và //
là các toán tử hai chiều (hai toán hạng, trái và phải, tử số và mẫu số)
/ -> Phân chia điểm nổi
// -> Phân chia tầng
Hãy xem một số ví dụ trong cả python 2.7 và Python 3.5.
Python 2.7.10 so với Python 3.5
print (2/3) ----> 0 Python 2.7
print (2/3) ----> 0.6666666666666666 Python 3.5
Python 2.7.10 so với Python 3.5
print (4/2) ----> 2 Python 2.7
print (4/2) ----> 2.0 Python 3.5
Bây giờ nếu bạn muốn có (trong python 2.7) cùng một đầu ra như trong python 3.5, bạn có thể làm như sau:
Python 2.7.10
from __future__ import division
print (2/3) ----> 0.6666666666666666 #Python 2.7
print (4/2) ----> 2.0 #Python 2.7
Trường hợp không có sự khác biệt giữa phân chia Tầng trong cả python 2.7 và trong Python 3.5
138.93//3 ---> 46.0 #Python 2.7
138.93//3 ---> 46.0 #Python 3.5
4//3 ---> 1 #Python 2.7
4//3 ---> 1 #Python 3.5
-100 // 33
=> -4 ; 100 // -33
=> -4 ; nhưng do hướng làm tròn của func sàn, nên cái tiếp theo có vẻ phản trực giác khi so sánh với trước: -100 // -33
=> 3 .
Như mọi người đã trả lời, //
là phân chia sàn.
Tại sao điều này lại quan trọng là sự //
phân chia sàn rõ ràng, trong tất cả các phiên bản Python từ 2.2, bao gồm cả phiên bản Python 3.x.
Hành vi của /
có thể thay đổi tùy thuộc vào:
__future__
nhập hay không (mô-đun cục bộ)-Q old
hoặc-Q new
>>> print 5.0 / 2
2.5
>>> print 5.0 // 2
2.0
Python 2.7 và phiên bản sắp tới khác của python:
/
)Chia toán hạng tay trái bằng toán hạng tay phải
Thí dụ: 4 / 2 = 2
//
)Việc phân chia các toán hạng trong đó kết quả là thương số trong đó các chữ số sau dấu thập phân được loại bỏ. Nhưng nếu một trong các toán hạng là âm, kết quả sẽ được thả nổi, nghĩa là được làm tròn từ 0 (hướng tới vô cực âm):
Ví dụ: 9//2 = 4
và 9.0//2.0 = 4.0
, -11//3 = -4
,-11.0//3 = -4.0
Cả /
Bộ phận và //
nhà điều hành phân chia sàn đều hoạt động theo cách tương tự.
Dấu gạch chéo kép //
, là phân chia sàn:
>>> 7//3
2
//
là phân chia tầng, nó sẽ luôn cung cấp cho bạn số nguyên của kết quả. Khác là phân chia 'thường xuyên'.
Các câu trả lời trên là tốt. Tôi muốn thêm một điểm nữa. Lên đến một số giá trị cả hai kết quả trong cùng một thương số. Sau đó toán tử phân chia tầng ( //
) hoạt động tốt nhưng không phải /
toán tử phân chia ( ).
- > int(755349677599789174/2)
- > 377674838799894592 #wrong answer
- > 755349677599789174 //2
- > 377674838799894587 #correct answer
5.0//2
kết quả 2.0
và không phải 2
vì loại trả về của giá trị trả về từ//
toán tử tuân theo quy tắc cưỡng chế python (kiểu đúc).
Python khuyến khích chuyển đổi kiểu dữ liệu thấp hơn (số nguyên) sang kiểu dữ liệu cao hơn (float) để tránh mất dữ liệu.
//
là phân chia sàn, nó sẽ luôn cung cấp cho bạn giá trị sàn của kết quả./
là phân chia dấu phẩy động.Sau đây là sự khác biệt giữa /
và //
; Tôi đã chạy các hoạt động số học này trong Python 3.7.2
>>> print (11 / 3)
3.6666666666666665
>>> print (11 // 3)
3
>>> print (11.3 / 3)
3.7666666666666667
>>> print (11.3 // 3)
3.0
//
toán tử thực hiện phép chia số nguyên.