Phân chia số nguyên Python mang lại float


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

Đây có phải là dự định? Tôi nhớ mạnh mẽ các phiên bản trước đó trở lại int/int=int? Tôi nên làm gì, có một toán tử phân chia mới hay tôi phải luôn luôn chọn?


31
Vâng, đó là cách phân chia hoạt động trong 3.x.
hughdbrown

2
Đây là một bài đăng của người tạo ra Python nói về cách làm tròn hoạt động, nó trực giao với câu hỏi của bạn nhưng tôi thấy nó thú vị: python-history.blogspot.com/2010/08/
Aaron D

@hughdbrown vậy có nghĩa là gì cho tất cả phiên bản python 3?
Charlie Parker

@hughdbrown: có, PEPcuối cùng , có nghĩa là cả được chấp nhận và thực hiện.
Jonas Byström

Câu trả lời:


285

Hãy xem PEP-238 : Thay đổi Người vận hành Bộ phận

Toán tử // sẽ có sẵn để yêu cầu phân chia sàn rõ ràng.


10
@JonathanSternberg ngoại trừ tất cả các mã được viết cho python 2.0. Tôi cảm thấy như vai trò của / và // nên được đảo ngược để giữ khả năng tương thích ngược. Ngoài ra, trong hầu hết các loại ngôn ngữ / bảo tồn khác. tôi sẽ có ý nghĩa hơn sau đó cho // để tự động chuyển đổi thành float, không /.
thang

1
Phần thứ hai (sau "Ngoài ra") có ý nghĩa (tương tự với các ngôn ngữ khác) nhưng liên quan đến phần thứ nhất, toàn bộ quan điểm của Python 3 là KHÔNG tương thích ngược với Python 2, mà là khắc phục một loạt vấn đề với Python 2. Đủ mọi người nhận thấy sự mơ hồ của /việc có đủ "lỗi" thiết kế ngôn ngữ cần được sửa trong Python 3. Đây có thể là một quyết định gây tranh cãi, nhưng đủ người cảm thấy đó là một quyết định đúng. Đếm tôi trong nhóm yêu thích sự thay đổi. Thật tốt khi tất cả chúng ta có thể đồng ý không đồng ý. Chúc mừng. :)
Ray Toal

59

Rất tiếc, ngay lập tức được tìm thấy 2//2.


5
Bạn có thể giải thích?
blueFast

4
Sử dụng điều này sẽ tạo ra một int, không phải là float @dangonfast.
Ashish Ahuja

Điều này dường như không làm việc cho các số âm. -1 // 5 trả về -1 và -5 // 5 trả về -1.
mschuett

@mschuett: điều này được mong đợi và là kết quả tương tự như với Python 2.
Jonas Byström

1
Vâng, tôi đã đào thêm một số thứ và cũng phát hiện ra điều đó. Tuy nhiên tôi sẽ tưởng tượng một số lượng lớn người không nhận ra điều này tùy thuộc vào ngôn ngữ họ đến từ.
mschuett

45

Hy vọng nó có thể giúp ai đó ngay lập tức.

Hành vi của Toán tử phân chia trong Python 2.7 và Python 3

Trong Python 2.7: Theo mặc định, toán tử chia sẽ trả về đầu ra số nguyên.

để có được kết quả nhân đôi 1.0 thành "chia cổ tức hoặc chia"

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

Trong 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
Nhân tiện, không cần nhân với 1.0. Nó là đủ để một trong những số là một float. Ví dụ: 100 / 35.0 = 100.0 / 35 = 2.857142857142857
Tal J. Levy

21

Câu trả lời được chấp nhận đã đề cập đến PEP 238 . Tôi chỉ muốn thêm một cái nhìn nhanh phía sau hậu trường cho những người quan tâm đến những gì đang diễn ra mà không cần đọc toàn bộ PEP.

Python bản đồ khai thác như +, -, */các chức năng đặc biệt, như vậy ví dụ như a + blà tương đương với

a.__add__(b)

Về phân chia bằng Python 2, có bằng cách chỉ mặc định /mà bản đồ để __div__và kết quả là phụ thuộc vào các loại đầu vào (ví dụ int, float).

Python 2.2 đã giới thiệu __future__tính năng này division, đã thay đổi ngữ nghĩa phân chia theo cách sau (TL; DR của PEP 238):

  • /các bản đồ __truediv__phải "trả về một xấp xỉ hợp lý của kết quả toán học của phép chia" (trích từ PEP 238)
  • //bản đồ đến __floordiv__, sẽ trả về kết quả nổi/

Với Python 3.0, các thay đổi của PEP 238 trở thành hành vi mặc định và không có phương thức nào đặc biệt hơn __div__trong mô hình đối tượng của Python.

Nếu bạn muốn sử dụng cùng một mã trong Python 2 và Python 3, hãy sử dụng

from __future__ import division

và tuân theo ngữ nghĩa PEP 238 của ///.


0

Theo tài liệu Python3, python khi được chia cho số nguyên, sẽ tạo float mặc dù dự kiến ​​là số nguyên.

Đối với độc quyền in số nguyên, sử dụng floor division method. Phân chia sàn được làm tròn số 0 và loại bỏ dấu thập phân.Represented by //

Do đó, thay vì 2/2, hãy sử dụng 2//2

Bạn cũng có thể nhập phân chia từ __future__bất kể sử dụng python2 hoặc python3.

Hy vọng nó giúp!

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.