Sự khác biệt giữa '/' và '//' khi được sử dụng để phân chia là gì?


Câu trả lời:


650

Trong Python 3.x, 5 / 2sẽ trở lại 2.55 // 2sẽ 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 // 2sẽ trở lại 2.0vì đó 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


đã chỉnh sửa: Bạn có thể "sửa" phân chia kể từ Python 2.2! (Chỉ cần đọc PEP được liên kết)
u0b34a0f6ae

2
cũng python -Qnew. các tùy chọn phân chia khác: -Qold(mặc định) -Qwarn,,-Qwarnall
John La Rooy

2
Đáng giá chỉ ra rằng 5.0 / 2trả về 2.5trong 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.
Chris

2
Còn khi số âm thì sao? Là hành vi giống nhau cho số nguyên âm?
Aaron Franke

1
@Srinivasu Ví dụ của bạn không hữu ích. Tốt hơn sẽ là 5 // 2 (mang lại 2) và -5 // 2 (mang lại -3).
Marvin

67

Làm rõ Python 2.x:

Để 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ố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.


33

//thực hiện "phân chia sàn", bất kể loại của bạn. Vì vậy, 1.0/2.0sẽ cho 0.5, nhưng cả hai 1/2, 1//21.0//2.0sẽ cho 0.

Xem https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator để biết chi tiết


Đây là một câu trả lời tốt. Liên kết PEP là hữu ích. Ngoài ra, hãy cân nhắc sử dụng 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.
Scott Lowrey

///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ố)
iono

28

/ -> 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

cái này có giống như int (5/2) không?
PirateApp

Còn khi số âm thì sao? Là hành vi giống nhau cho số nguyên âm?
Aaron Franke

1
Re: Tiêu cực - Hành vi là như nhau, nhưng hãy nhớ rằng kết quả là sàn, vì vậy làm tròn luôn hướng xuống tiêu cực hơn . Một số ví dụ: -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 .
Erdős-Bacon

22

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:

  • Hoạt động __future__ nhập hay không (mô-đun cục bộ)
  • Tùy chọn dòng lệnh Python, -Q oldhoặc-Q new

10
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0

1
Không nhận ra rằng phân chia sàn cũng hoạt động với các số nguyên. Cảm ơn!
Mike

5

Python 2.7 và phiên bản sắp tới khác của python:

  • Bộ phận ( /)

Chia toán hạng tay trái bằng toán hạng tay phải

Thí dụ: 4 / 2 = 2

  • Bộ phận sàn ( //)

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 = 49.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ự.


2
Hướng tới vô cùng và xa không là những điều khác nhau. Ví dụ cho (-1.2 và 3.4): "sàn" hướng tới vô cực âm (-2 và 3), "cắt ngắn" là về 0 (-1 và 3), "bão hòa" nằm cách 0 (-2 và 4), và "trần" là hướng tới vô cực dương (-1 và 4).
Phernost


3

//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'.


2

Câu trả lời của phương trình được làm tròn đến số nguyên nhỏ hơn tiếp theo hoặc float với .0 là dấu thập phân.

>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0

2

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

-1

5.0//2kết quả 2.0và không phải 2loạ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.


-1
  • // 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ả.
  • Và cái còn lại /là phân chia dấu phẩy động.

Sau đây là sự khác biệt giữa ///; 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

2
Làm thế nào để câu trả lời này thêm bất cứ điều gì mà các ý tưởng khác không bao gồm? Hoặc làm thế nào là câu trả lời này tốt hơn trong bất kỳ cách nào so với các câu trả lời khác?
Rory Daulton 23/03/19

2
Sau đây là đầu ra của một chương trình. Nó không giải thích gì cả.
Hầu tước Lorne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.