Divisi python integer menghasilkan 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

Apakah ini dimaksudkan? Saya sangat ingat versi sebelumnya kembali int/int=int? Apa yang harus saya lakukan, apakah ada operator divisi baru atau harus saya selalu casting?

Jonas Byström
sumber
31
Ya, itulah cara pembagian bekerja di 3.x.
hughdbrown
2
Berikut ini adalah posting oleh pembuat Python yang berbicara tentang bagaimana pembulatannya bekerja, itu ortogonal untuk pertanyaan Anda, tetapi saya menemukan itu menarik: python-history.blogspot.com/2010/08/…
Aaron D
@hughdbrown sehingga artinya untuk semua versi python 3 pada dasarnya?
Charlie Parker
@hughdbrown: ya, PEP adalah akhir , yang berarti baik diterima dan dilaksanakan.
Jonas Byström

Jawaban:

285

Lihatlah PEP-238 : Mengubah Operator Divisi

Operator // akan tersedia untuk meminta pembagian lantai dengan jelas.

Brandon E Taylor
sumber
10
@ JonathanSternberg kecuali untuk semua kode yang ditulis untuk python 2.0. Saya merasa peran / dan // harus dibalik untuk menjaga kompatibilitas. Juga, dalam hampir semua jenis bahasa / pengawet lainnya. saya akan lebih masuk akal jika // untuk secara otomatis dikonversi ke float, bukan /.
thang
1
Bagian kedua (setelah "Juga") masuk akal (mirip dengan bahasa lain) tetapi mengenai bagian pertama, seluruh poin Python 3 adalah TIDAK kompatibel dengan Python 2, tetapi lebih tepatnya memperbaiki banyak masalah dengan Python 2. Cukup banyak orang yang mendapati ambiguitas /menjadi cukup dari "kesalahan" desain bahasa yang perlu diperbaiki dengan Python 3. Ini mungkin merupakan keputusan yang kontroversial, tetapi cukup banyak orang merasa itu adalah yang benar. Hitung saya dalam kelompok yang menyukai perubahan. Sangat menyenangkan kita semua bisa setuju untuk tidak setuju. Bersulang. :)
Ray Toal
59

Ups, segera ditemukan 2//2.

Jonas Byström
sumber
5
Bisakah Anda menguraikan?
blueFast
4
Menggunakan ini akan menampilkan int, bukan float @dangonfast.
Ashish Ahuja
Ini sepertinya tidak berfungsi untuk angka negatif. -1 // 5 return -1 dan -5 // 5 menghasilkan -1.
mschuett
@mschuett: ini yang diharapkan, dan hasilnya sama dengan Python 2.
Jonas Byström
1
Ya saya melakukan penggalian lagi dan menemukan itu juga. Namun saya akan membayangkan ukuran yang layak jumlah orang tidak menyadari hal ini tergantung pada bahasa asal mereka.
mschuett
45

Semoga ini bisa membantu seseorang secara instan.

Perilaku Operator Divisi di Python 2.7 dan Python 3

Dalam Python 2.7: Secara default, operator divisi akan mengembalikan output integer.

untuk mendapatkan hasil dalam kelipatan ganda 1.0 menjadi "dividen atau pembagi"

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

Dalam 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
VijayNaidu
sumber
1
Omong-omong, tidak perlu dikalikan dengan 1,0. Sudah cukup bahwa salah satu angka adalah pelampung. Misalnya, 100 / 35.0 = 100.0 / 35 = 2.857142857142857
Tal J. Levy
21

Jawaban yang diterima sudah menyebutkan PEP 238 . Saya hanya ingin menambahkan pandangan cepat ke belakang layar untuk mereka yang tertarik dengan apa yang terjadi tanpa membaca keseluruhan PEP.

Python peta operator seperti +, -, *dan /untuk fungsi-fungsi khusus, sehingga misalnya a + bsetara dengan

a.__add__(b)

Mengenai pembagian di Python 2, secara default hanya ada /yang memetakan __div__dan hasilnya tergantung pada jenis input (misalnya int, float).

Python 2.2 memperkenalkan __future__fitur division, yang mengubah semantik divisi dengan cara berikut (TL; DR dari PEP 238):

  • /peta __truediv__yang harus "mengembalikan perkiraan yang masuk akal dari hasil matematika divisi" (kutipan dari PEP 238)
  • //peta ke __floordiv__, yang seharusnya mengembalikan hasil lantai dari/

Dengan Python 3.0, perubahan PEP 238 menjadi perilaku default dan tidak ada metode khusus __div__dalam model objek Python.

Jika Anda ingin menggunakan kode yang sama dalam Python 2 dan Python 3 gunakan

from __future__ import division

dan menempel pada semantik PEP 238 dari /dan //.

code_onkel
sumber
0

Menurut dokumentasi Python3, python ketika dibagi dengan integer, akan menghasilkan float meskipun diharapkan menjadi integer.

Untuk mencetak bilangan bulat secara eksklusif, gunakan floor division method. Pembagian lantai adalah pembulatan nol dan menghilangkan titik desimal.Represented by //

Karenanya, alih-alih 2/2, gunakan 2//2

Anda juga dapat mengimpor divisi dari __future__terlepas dari menggunakan python2 atau python3.

Semoga ini bisa membantu!

addy
sumber