ส่วนจำนวนเต็มหลามให้ผลลอย


223
Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

สิ่งนี้ตั้งใจหรือไม่ ฉันจำรุ่นก่อนหน้านี้ได้int/int=intหรือไม่ ฉันควรทำอย่างไรมีผู้ปฏิบัติงานแผนกใหม่หรือไม่


31
ใช่นั่นคือวิธีการแบ่งงานใน 3.x
hughdbrown

2
นี่คือข้อความที่โพสต์โดยผู้สร้าง Python ที่พูดถึงวิธีการปัดเศษมันเป็นฉากคำถามของคุณ แต่ฉันพบว่ามันน่าสนใจ: python-history.blogspot.com/2010/08/ …
Aaron D

@hughdbrown ดังนั้นนั่นหมายความว่าสำหรับpython 3 ทุกรุ่นเป็นหลัก?
Charlie Parker

@hughdbrown: ใช่PEPถือเป็นที่สุดหมายถึงยอมรับและนำไปใช้งาน
Jonas Byström

คำตอบ:


285

ดูPEP-238 : การเปลี่ยนผู้ปฏิบัติงานในแผนก

ตัวดำเนินการ // จะพร้อมใช้งานเพื่อร้องขอการแบ่งชั้นอย่างไม่น่าสงสัย


10
@JonathanSternberg ยกเว้นรหัสทั้งหมดที่เขียนขึ้นสำหรับ python 2.0 ฉันรู้สึกว่าบทบาทของ / และ // ควรกลับด้านเพื่อให้เข้ากันได้ย้อนหลัง นอกจากนี้ในภาษาอื่น ๆ / ภาษาดองทุกประเภท ฉันจะทำให้รู้สึกมากขึ้นแล้ว / / สำหรับการแปลงโดยอัตโนมัติเพื่อลอยไม่ใช่ /
ท้อง

1
ส่วนที่สอง (หลัง "ยัง") ทำให้รู้สึก (คล้ายกับภาษาอื่น ๆ ) แต่เกี่ยวกับส่วนแรกจุดทั้งหมดของ Python 3 คือการไม่ย้อนกลับเข้ากันได้กับ Python 2 แต่จะแก้ไขปัญหามากมายกับ Python 2. ผู้คนมากพอพบว่ามีความคลุมเครือใน/การออกแบบภาษา "ผิดพลาด" ซึ่งจำเป็นต้องได้รับการแก้ไขใน Python 3 อาจเป็นการตัดสินใจที่ขัดแย้ง แต่พอมีคนรู้สึกว่ามันถูกต้อง นับฉันในกลุ่มที่รักการเปลี่ยนแปลง เป็นเรื่องดีที่เราทุกคนสามารถเห็นด้วยที่จะไม่เห็นด้วย ไชโย :)
Ray Toal

59

2//2โอ๊ะพบทันที


5
คุณสามารถทำอย่างละเอียด?
blueFast

4
การใช้สิ่งนี้จะแสดงผล int ไม่ใช่แบบลอย @dangonfast
Ashish Ahuja

ดูเหมือนว่าจะไม่ได้ผลสำหรับจำนวนลบ -1 // 5 return -1 และ -5 // 5 return -1
mschuett

@mschuett: นี่เป็นสิ่งที่คาดหวังและเป็นผลเช่นเดียวกับ Python 2
Jonas Byström

1
ใช่ฉันทำการขุดเพิ่มเติมและพบว่าเช่นกัน อย่างไรก็ตามฉันคิดว่าจำนวนคนที่เหมาะสมไม่ได้ตระหนักถึงสิ่งนี้ขึ้นอยู่กับภาษาที่มาจากพวกเขา
mschuett

45

หวังว่ามันจะช่วยใครซักคนได้ทันที

พฤติกรรมของตัวดำเนินการหารใน Python 2.7 และ Python 3

ใน Python 2.7: ตามค่าเริ่มต้นตัวดำเนินการหารจะส่งคืนเอาต์พุตจำนวนเต็ม

การรับผลลัพธ์เป็นทวีคูณ 1.0เป็น "เงินปันผลหรือตัวหาร"

100/35 => 2 #(Expected is 2.857142857142857)
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857

ใน Python 3

// => used for integer output
/ => used for double output

100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0    # floating-point result if divsor or dividend real

1
ไม่จำเป็นต้องคูณด้วย 1.0 ก็เพียงพอแล้วที่หนึ่งในตัวเลขนั้นจะลอย เช่น 100 / 35.0 = 100.0 / 35 = 2.857142857142857
Tal J. Levy

21

คำตอบที่ได้รับการยอมรับแล้วกล่าวPEP 238 ฉันแค่ต้องการเพิ่มความรวดเร็วให้กับเบื้องหลังสำหรับผู้ที่สนใจในสิ่งที่กำลังเกิดขึ้นโดยไม่ต้องอ่าน PEP ทั้งหมด

งูหลามแผนที่ประกอบการเช่น+, -, *และ/ฟังก์ชั่นพิเศษดังกล่าวว่าเช่นa + bเทียบเท่ากับ

a.__add__(b)

เกี่ยวกับการแบ่งในหลาม 2 มีโดยเริ่มต้นเท่านั้น/ซึ่งแมปไป__div__และผลที่ได้จะขึ้นอยู่กับรูปแบบการใส่ (เช่นint, float)

Python 2.2 แนะนำ__future__คุณสมบัติdivisionซึ่งเปลี่ยน semantics ส่วนด้วยวิธีต่อไปนี้ (TL; DR ของ PEP 238):

  • /แผนที่__truediv__ที่จะต้อง "ส่งคืนการประมาณที่สมเหตุสมผลของผลลัพธ์ทางคณิตศาสตร์ของการหาร" (ใบเสนอราคาจาก PEP 238)
  • //แผนที่ไป__floordiv__ซึ่งควรส่งคืนผลลัพธ์ที่เป็นพื้นของ/

ด้วย Python 3.0 การเปลี่ยนแปลงของ PEP 238 กลายเป็นพฤติกรรมเริ่มต้นและไม่มีวิธีพิเศษ__div__ในโมเดลวัตถุของ Python อีกต่อไป

หากคุณต้องการใช้รหัสเดียวกันใน Python 2 และ Python 3 ให้ใช้

from __future__ import division

และติด PEP 238 ความหมายของและ///


0

ตามเอกสารของ Python3 ไพ ธ อนเมื่อหารด้วยจำนวนเต็มจะสร้างโฟลว์แม้ว่าจะคาดว่าจะเป็นจำนวนเต็ม

floor division methodสำหรับการพิมพ์เฉพาะจำนวนเต็มใช้ การแบ่งชั้นปัดเศษออกเป็นศูนย์และลบจุดทศนิยมRepresented by //

ดังนั้นแทนที่จะเป็น 2/2 ให้ใช้ 2//2

นอกจากนี้คุณยังสามารถนำเข้าการแบ่งส่วน__future__โดยไม่คำนึงถึงการใช้ python2 หรือ python3

หวังว่ามันจะช่วย!

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