Apa perbedaan antara '/' dan '//' saat digunakan untuk pembagian?

474

Apakah ada manfaat menggunakan satu di atas yang lain? Dalam Python 2, keduanya sepertinya mengembalikan hasil yang sama:

>>> 6/3
2
>>> 6//3
2
sinar
sumber
1
Silakan merujuk Masalah dengan Divisi Integer untuk alasan memperkenalkan //operator untuk melakukan divisi integer.
Sriram

Jawaban:

651

Dalam Python 3.x, 5 / 2akan kembali 2.5dan 5 // 2akan kembali 2. Yang pertama adalah divisi floating point, dan yang terakhir adalah divisi lantai , kadang-kadang juga disebut divisi integer .

Dalam Python 2.2 atau lebih baru di baris 2.x, tidak ada perbedaan untuk bilangan bulat kecuali Anda melakukan from __future__ import division, yang menyebabkan Python 2.x untuk mengadopsi perilaku 3.x.

Terlepas dari impor di masa depan, 5.0 // 2akan kembali 2.0karena itulah hasil pembagian lantai operasi.

Anda dapat menemukan deskripsi terperinci di https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator

Eli Courtwright
sumber
diedit: Anda dapat "memperbaiki" divisi sejak Python 2.2! (Cukup baca PEP yang ditautkan)
u0b34a0f6ae
2
juga python -Qnew. opsi divisi lainnya: -Qold(default) -Qwarn,,-Qwarnall
John La Rooy
2
Layak menunjukkan bahwa 5.0 / 2kembali 2.5di semua versi, seperti halnya 5 / 2.0- perilaku lama hanya berbeda ketika kedua operan int.
Chris
2
Bagaimana dengan ketika angkanya negatif? Apakah perilaku sama untuk bilangan bulat negatif?
Aaron Franke
1
@Srinivasu Teladan Anda tidak membantu. Lebih baik adalah 5 // 2 (yang menghasilkan 2) dan -5 // 2 (yang menghasilkan -3).
Marvin
67

Python 2.x Klarifikasi:

Untuk memperjelas garis Python 2.x, /bukan pembagian lantai atau pembagian sejati. Jawaban yang diterima saat ini tidak jelas tentang ini.

/adalah pembagian lantai ketika kedua args berada int, tetapi adalah pembagian yang benar ketika salah satu atau kedua argumen tersebut berada float.

Di atas mengatakan lebih banyak kebenaran, dan lebih jelas daripada paragraf 2 dalam jawaban yang diterima.

Yichun
sumber
33

//mengimplementasikan "pembagian lantai", terlepas dari tipe Anda. Jadi 1.0/2.0akan memberi 0.5, tetapi keduanya 1/2, 1//2dan 1.0//2.0akan memberi 0.

Lihat https://docs.python.org/whatsnew/2.2.html#pep-238-changing-the-division-operator untuk detail

Kena
sumber
Ini jawaban yang bagus. Tautan PEP sangat membantu. Juga, pertimbangkan untuk menggunakan math.floor()atau math.fmod()jika Anda tidak yakin apa yang terjadi dengan operator unary.
Scott Lowrey
/dan //operator dua arah (dua operan, kiri dan kanan, pembilang dan penyebut)
iono
28

/ -> Divisi titik mengambang

// -> Divisi lantai

Mari kita lihat beberapa contoh di kedua python 2.7 dan di Python 3.5.

Python 2.7.10 vs Python 3.5

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

Python 2.7.10 vs Python 3.5

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

Sekarang jika Anda ingin memiliki (sama dengan python 2.7) keluaran yang sama seperti pada python 3.5, Anda dapat melakukan hal berikut:

Python 2.7.10

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

Dimana tidak ada perbedaan antara pembagian Lantai di kedua python 2.7 dan di 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
N Randhawa
sumber
apakah ini sama dengan int (5/2)?
PirateApp
Bagaimana dengan ketika angkanya negatif? Apakah perilaku sama untuk bilangan bulat negatif?
Aaron Franke
1
Re: Negatif - Perilaku adalah sama, tetapi ingat bahwa hasilnya adalah lantai, jadi pembulatan selalu turun ke arah yang lebih negatif . Beberapa contoh: -100 // 33=> -4 ; 100 // -33=> -4 ; tetapi karena arah pembulatan func lantai, yang berikutnya bisa tampak kontra-intuitif jika dibandingkan dengan sebelumnya: -100 // -33=> 3 .
Erdős-Bacon
22

Seperti yang semua orang sudah jawab, //adalah pembagian lantai.

Mengapa ini penting adalah bahwa //pembagian lantai jelas, di semua versi Python dari 2.2, termasuk versi Python 3.x.

Perilaku /dapat berubah tergantung pada:

  • __future__Impor aktif atau tidak (modul-lokal)
  • Opsi baris perintah Python, baik -Q oldatau-Q new
u0b34a0f6ae
sumber
10
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0
Jalan Jonas Sciangula
sumber
1
Tidak menyadari bahwa pembagian lantai bekerja dengan non-integer juga. Terima kasih!
Mike
5

Python 2.7 dan versi python yang akan datang:

  • Divisi ( /)

Membagi operan tangan kiri dengan operan tangan kanan

Contoh: 4 / 2 = 2

  • Divisi Lantai ( //)

Pembagian operan di mana hasilnya adalah hasil bagi di mana digit setelah titik desimal dihapus. Tetapi jika salah satu operan negatif, hasilnya adalah lantai, yaitu dibulatkan dari nol (menuju infinity negatif):

Contoh: 9//2 = 4dan 9.0//2.0 = 4.0, -11//3 = -4,-11.0//3 = -4.0

Kedua /Divisi dan //lantai divisi operator yang beroperasi di cara yang sama.

Abrar Ahmad
sumber
2
Menuju keabadian dan menjauh dari nol adalah hal yang berbeda. Contoh untuk (-1.2 dan 3.4): "lantai" mengarah ke infinity negatif (-2 dan 3), "memotong" menuju nol (-1 dan 3), "jenuh" jauh dari nol (-2 dan 4), dan "langit-langit" mengarah ke infinity positif (-1 dan 4).
Phernost
4

Garis miring ganda //,, adalah pembagian lantai:

>>> 7//3
2
Mark Roddy
sumber
3

//adalah pembagian lantai, itu akan selalu memberi Anda bilangan bulat dari hasilnya. Yang lainnya adalah divisi 'reguler'.

Adam Bellaire
sumber
2

Jawaban persamaan dibulatkan ke bilangan bulat kecil berikutnya atau mengapung dengan 0,0 sebagai titik desimal.

>>>print 5//2
2
>>> print 5.0//2
2.0
>>>print 5//2.0
2.0
>>>print 5.0//2.0
2.0
G.
sumber
2

Jawaban di atas bagus. Saya ingin menambahkan poin lain. Hingga beberapa nilai keduanya menghasilkan hasil bagi yang sama. Setelah itu operator divisi lantai ( //) berfungsi dengan baik tetapi tidak /operator divisi ( ).

 - > int(755349677599789174/2)
 - > 377674838799894592      #wrong answer
 - > 755349677599789174 //2
 - > 377674838799894587      #correct answer
ram jaya
sumber
-1

5.0//2menghasilkan 2.0, dan bukan 2karena tipe pengembalian nilai pengembalian dari //operator mengikuti aturan pemaksaan python (tipe casting).

Python mempromosikan konversi tipe data yang lebih rendah (integer) ke tipe data yang lebih tinggi (float) untuk menghindari kehilangan data.

Sebastian Purakan
sumber
-1
  • // adalah pembagian lantai, itu akan selalu memberi Anda nilai dasar dari hasilnya.
  • Dan yang lainnya /adalah divisi floating-point.

Berikut ini adalah perbedaan antara /dan //; Saya telah menjalankan operasi aritmatika ini dengan 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
Fatema T. Zuhora
sumber
2
Bagaimana jawaban ini menambahkan sesuatu yang tidak dicakup oleh gagasan lain? Atau bagaimana jawaban ini lebih baik dalam cara apa pun daripada jawaban lainnya?
Rory Daulton
2
Berikut ini adalah output dari suatu program. Itu tidak menjelaskan apa-apa.
Marquis of Lorne