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


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


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.


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


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

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

10
>>> print 5.0 / 2
2.5

>>> print 5.0 // 2
2.0

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.


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


3

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


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

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

-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.


-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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.