อะไรคือความแตกต่างระหว่าง '/' และ '//' เมื่อใช้สำหรับการหาร?


473

มีประโยชน์ในการใช้อย่างใดอย่างหนึ่งมากกว่าที่อื่น ๆ ? ใน Python 2 พวกเขาทั้งคู่ดูเหมือนจะให้ผลลัพธ์ที่เหมือนกัน:

>>> 6/3
2
>>> 6//3
2

1
โปรดอ้างอิงปัญหากับจำนวนเต็มสำหรับเหตุผลในการแนะนำ//ผู้ปฏิบัติงานให้ทำหารจำนวนเต็ม
ศรีราม

คำตอบ:


650

ในหลาม 3.x, 5 / 2จะกลับมา2.5และจะกลับมา5 // 2 2อดีตลอยส่วนจุดและหลังเป็นส่วนชั้นบางครั้งเรียกว่าจำนวนเต็มส่วน

ใน Python 2.2 หรือใหม่กว่าในบรรทัด 2.x ไม่มีความแตกต่างสำหรับจำนวนเต็มเว้นแต่ว่าคุณจะทำ a from __future__ import divisionซึ่งทำให้ Python 2.x ใช้พฤติกรรม 3.x

ไม่คำนึงถึงการนำเข้าในอนาคต5.0 // 2จะกลับมา2.0เนื่องจากเป็นผลการแบ่งชั้นของการดำเนินการ

คุณสามารถดูคำอธิบายโดยละเอียดได้ที่https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator


แก้ไข: คุณสามารถ "แก้ไข" หมวดตั้งแต่ Python 2.2! (เพียงอ่าน PEP ที่เชื่อมโยง)
u0b34a0f6ae

2
python -Qnewด้วย ตัวเลือกส่วนอื่น ๆ : -Qold(ค่าเริ่มต้น) -Qwarn,-Qwarnall
จอห์นลา Rooy

2
คุ้มค่าที่ชี้ให้เห็นว่า5.0 / 2ผลตอบแทน2.5ในทุกรุ่นเช่นเดียวกับ5 / 2.0- intพฤติกรรมเก่าที่แตกต่างกันเฉพาะเมื่อทั้งสองตัวถูกดำเนินการอยู่
คริส

2
แล้วตัวเลขจะเป็นลบเมื่อไหร่? พฤติกรรมนี้เหมือนกันสำหรับจำนวนเต็มลบหรือไม่
Aaron Franke

1
@Srinivasu ตัวอย่างของคุณไม่มีประโยชน์ ดีกว่าคือ 5 // 2 (ซึ่งให้ 2) และ -5 // 2 (ซึ่งให้ -3)
Marvin

67

Python 2.x ชี้แจง:

เพื่อชี้แจงสำหรับสาย Python 2.x /ไม่ใช่การแบ่งพื้นหรือการหารที่แท้จริง คำตอบที่ยอมรับในปัจจุบันไม่ชัดเจนในเรื่องนี้

/เป็นส่วนชั้นเมื่อทั้ง args มีintแต่เป็นส่วนจริงเมื่อหนึ่งหรือทั้งสองของ args floatเป็น

ข้างต้นบอกความจริงมากกว่าและชัดเจนกว่าวรรค 2 ในคำตอบที่ยอมรับ


33

//ใช้ "การแบ่งชั้น" โดยไม่คำนึงถึงประเภทของคุณ ดังนั้น 1.0/2.0จะให้0.5แต่ทั้งสอง1/2, 1//2และจะให้1.0//2.00

ดูhttps://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operatorสำหรับรายละเอียด


นี่เป็นคำตอบที่ดี ลิงค์ PEP มีประโยชน์ ลองใช้ดูmath.floor()หรือmath.fmod()ถ้าคุณไม่แน่ใจว่าเกิดอะไรขึ้นกับตัวดำเนินการเอก
Scott Lowrey

/และ//เป็นตัวดำเนินการแบบสองชั้น (สองตัวถูกดำเนินการ, ซ้ายและขวา, ตัวเศษและส่วน)
iono

28

/ -> การแบ่งจุดลอยตัว

// -> การแบ่งชั้น

ให้ดูตัวอย่างทั้งใน python 2.7 และ Python 3.5

Python 2.7.10 กับ Python 3.5

print (2/3)  ----> 0                   Python 2.7
print (2/3)  ----> 0.6666666666666666  Python 3.5

Python 2.7.10 กับ Python 3.5

  print (4/2)  ----> 2         Python 2.7
  print (4/2)  ----> 2.0       Python 3.5

ตอนนี้ถ้าคุณต้องการมีเอาต์พุต (ใน python 2.7) เหมือนกับใน python 3.5 คุณสามารถทำสิ่งต่อไปนี้:

Python 2.7.10

from __future__ import division
print (2/3)  ----> 0.6666666666666666   #Python 2.7
print (4/2)  ----> 2.0                  #Python 2.7

โดยที่ไม่มีความแตกต่างระหว่างการแบ่งชั้นในทั้งงูใหญ่ 2.7 และงูหลาม 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

นี่เหมือนกับ int (5/2) หรือไม่
PirateApp

แล้วตัวเลขจะเป็นลบเมื่อไหร่? พฤติกรรมนี้เหมือนกันสำหรับจำนวนเต็มลบหรือไม่
Aaron Franke

1
Re: Negatives - พฤติกรรมเหมือนกัน แต่โปรดจำไว้ว่าผลลัพธ์นั้นเป็นพื้นดังนั้นการปัดเศษจะลดลงไปทางลบมากกว่าเสมอ ตัวอย่างบางส่วน: -100 // 33=> -4 ; 100 // -33=> -4 ; แต่เนื่องจากทิศทางการปัดเศษของ func ชั้นหนึ่งต่อไปอาจดูเหมือนเคาน์เตอร์เมื่อเทียบกับก่อนหน้านี้: -100 // -33=> 3
Erdős-Bacon

22

ตามที่ทุกคนตอบไปแล้วการ//แบ่งชั้นคือ

เหตุใดสิ่งนี้จึงมีความสำคัญนั่น//คือการแบ่งชั้นอย่างไม่น่าสงสัยในเวอร์ชัน Python ทั้งหมดจาก 2.2 รวมถึงเวอร์ชัน Python 3.x

พฤติกรรมของ/สามารถเปลี่ยนแปลงได้ขึ้นอยู่กับ:

  • __future__นำเข้าที่ใช้งานอยู่หรือไม่ (โมดูลท้องถิ่น)
  • ตัวเลือกบรรทัดคำสั่งหลามอย่างใดอย่างหนึ่ง-Q oldหรือ-Q new

10
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0

1
ไม่ได้ตระหนักว่าการแบ่งพื้นที่ทำงานกับไม่ใช่จำนวนเต็มเช่นกัน ขอบคุณ!
Mike

5

Python 2.7 และ python เวอร์ชั่นอื่นที่กำลังจะมาถึง:

  • ส่วน ( /)

แบ่งตัวถูกดำเนินการทางซ้ายด้วยตัวถูกดำเนินการทางขวา

ตัวอย่าง: 4 / 2 = 2

  • แผนกชั้น ( //)

การหารของโอเปอแรนด์ที่ผลลัพธ์เป็นผลหารของตัวเลขหลังจากลบจุดทศนิยม แต่ถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งเป็นลบผลลัพธ์จะถูกปูพื้นเช่นถูกปัดเศษจากศูนย์ (ไปทางอนันต์ลบ):

ตัวอย่าง: 9//2 = 4และ9.0//2.0 = 4.0, -11//3 = -4,-11.0//3 = -4.0

ทั้งสอง/ฝ่ายและ//ผู้ประกอบการส่วนชั้นที่มีการดำเนินงานในรูปแบบเหมือนกัน


2
ไปสู่อินฟินิตี้และห่างจากศูนย์เป็นสิ่งที่แตกต่างกัน ตัวอย่างสำหรับ (-1.2 และ 3.4): "การปูพื้น" ไปทางลบอนันต์ (-2 และ 3), "การตัด" เป็นศูนย์ (-1 และ 3), "saturating" อยู่ห่างจากศูนย์ (-2 และ 4), และ "เพดาน" มีค่าเป็นบวกอนันต์ (-1 และ 4)
Phernost



2

คำตอบของสมการนี้จะถูกปัดเศษให้เป็นจำนวนเต็มหรือทศนิยมที่น้อยกว่าถัดไปโดยมีทศนิยมเป็น 0

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

2

คำตอบข้างต้นเป็นสิ่งที่ดี ฉันต้องการเพิ่มจุดอื่น ค่าบางค่าทั้งสองค่าจะมีค่าความฉลาดเท่ากัน หลังจากนั้นตัวดำเนินการหารพื้น ( //) นั้นทำงานได้ดี แต่ไม่ใช่/ตัวดำเนินการหาร ( )

 - > int(755349677599789174/2)
 - > 377674838799894592      #wrong answer
 - > 755349677599789174 //2
 - > 377674838799894587      #correct answer

-1

5.0//2ส่งผล2.0ให้และไม่ใช่2เพราะประเภทการส่งคืนของค่าส่งคืนจาก//ผู้ประกอบการเป็นไปตามกฎการบังคับใช้แบบหลาม (การหล่อแบบ)

Python ส่งเสริมการแปลงประเภทข้อมูลที่ต่ำกว่า (จำนวนเต็ม) เป็นประเภทข้อมูลที่สูงขึ้น (ลอย) เพื่อหลีกเลี่ยงการสูญเสียข้อมูล


-1
  • // คือการแบ่งชั้นมันจะให้ค่าของผลลัพธ์กับพื้นเสมอ
  • และอีกอันหนึ่ง/คือการหารจุดลอยตัว

ความแตกต่างระหว่าง/และ//; ฉันใช้การคำนวณทางคณิตศาสตร์เหล่านี้ใน 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
คำตอบนี้เพิ่มอะไรที่ความคิดอื่น ๆ ไม่ครอบคลุมได้อย่างไร หรือว่าคำตอบนี้ดีกว่าในทางใดทางหนึ่งมากกว่าคำตอบอื่น ๆ ?
Rory Daulton

2
ต่อไปนี้เป็นผลลัพธ์ของโปรแกรม มันอธิบายอะไร
มาร์ควิสแห่ง Lorne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.