Divisi Python

133

Saya mencoba untuk menormalkan satu set angka dari -100 ke 0 hingga kisaran 10-100 dan mengalami masalah hanya untuk memperhatikan bahwa bahkan tanpa variabel sama sekali, ini tidak mengevaluasi cara yang saya harapkan:

>>> (20-10) / (100-10)
0

Divisi float juga tidak berfungsi:

>>> float((20-10) / (100-10))
0.0

Jika salah satu sisi divisi dilemparkan ke pelampung, ia akan bekerja:

>>> (20-10) / float((100-10))
0.1111111111111111

Setiap sisi dalam contoh pertama mengevaluasi sebagai int yang berarti jawaban akhir akan dilemparkan ke int. Karena 0.111 kurang dari 0,5, itu membulatkan ke 0. Ini tidak transparan menurut pendapat saya, tapi saya kira itulah caranya.

Apa penjelasannya?

Adam Nelson
sumber
3
Adam, aku masih tidak suka penjelasanmu. Contoh pertama adalah pembagian integer, yang hanya mengembalikan 0. Contoh kedua disisipkan dengan kurung untuk efek yang Anda inginkan.
Presiden James K. Polk
@Regreg Contoh pertama adalah masalahnya. Contoh kedua adalah penjelasan dan ditulis setelah pertanyaan pertama. Semua jawaban di bawah ini menjelaskan masalah ini dengan sangat baik, terutama dari @KennyTM. Penting untuk dicatat bahwa masalah asli saya hanya masalah pada Python 2.x, bukan 3. Ini sedikit membingungkan bahwa perilaku akan berubah seperti itu, tetapi sekarang saya tahu, saya akan menggunakan divisi impor di masa depan dan menggunakan 3 perilaku .x. Bersulang.
Adam Nelson
1
Adam, perbaiki EDIT terakhir Anda. Sisi kanan tidak ada yang spesial untuk itu; agar pembagian menjadi float, baik pembilang atau penyebut (atau keduanya) harus float. Jika Anda pikir Anda membaca di dalam dokumen bahwa sisi kanan perlu mengapung, maka dokumentasinya salah dan harus dikoreksi, atau Anda salah paham. Apakah Anda melihat contoh, mungkin, dan kemudian memperkirakan sebuah aturan dari itu?
tzot

Jawaban:

246

Anda menggunakan Python 2.x, di mana divisi integer akan terpotong alih-alih menjadi angka floating point.

>>> 1 / 2
0

Anda harus membuat salah satunya float:

>>> float(10 - 20) / (100 - 10)
-0.1111111111111111

atau from __future__ import division, yang memaksa /untuk mengadopsi perilaku Python 3.x yang selalu mengembalikan float.

>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111
kennytm
sumber
10
Jika Anda menggunakan, from __future__ import divisionAnda bisa mendapatkan perilaku pembagian gaya-C lama dengan menggunakan dua garis miring (mis. 1 // 2Akan menghasilkan 0). Lihat Pep 238 Mengubah Operator Divisi
Pengguna
1
@ Pengguna Tidak perlu mengimpor dari __future__. Baik dalam Python 2 dan 3 //mengacu __floordiv__()secara default.
Casimir
21

Anda memasukkan Integer sehingga Python memberi Anda integer kembali :

>>> 10 / 90
0

Jika jika Anda melemparkan ini ke float setelah itu pembulatan akan dilakukan, dengan kata lain, 0 integer akan selalu menjadi 0 float.

Jika Anda menggunakan pelampung di kedua sisi divisi maka Python akan memberikan jawaban yang Anda harapkan.

>>> 10 / 90.0
0.1111111111111111

Jadi dalam kasus Anda:

>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
Dave Webb
sumber
11

Anda perlu mengubahnya menjadi pelampung SEBELUM Anda melakukan pembagian. Itu adalah:

float(20 - 10) / (100 - 10)
A. Retribusi
sumber
4
@ Adam Nelson: Berfungsi dengan benar untuk saya. Periksa tanda kurung Anda.
Fred Larson
Sebenarnya, saya salah - tetapi setelah melihat dokumen, seseorang harus melemparkan sisi kanan terlebih dahulu.
Adam Nelson
10
@ Adam: Tidak masalah sisi mana yang pertama.
kennytm
11

Dalam Python 2.7, /operator adalah divisi bilangan bulat jika input bilangan bulat:

>>>20/15
1

>>>20.0/15.0
1.33333333333

>>>20.0/15
1.33333333333

Dalam Python 3.3, /operator adalah divisi float bahkan jika inputnya bilangan bulat.

>>> 20/15
1.33333333333

>>>20.0/15
1.33333333333

Untuk pembagian integer di Python 3, kita akan menggunakan // operator.

Itu // operator adalah operator pembagian integer di kedua Python 2.7 dan Python 3.3.

Dalam Python 2.7 dan Python 3.3:

>>>20//15
1

Sekarang, lihat perbandingannya

>>>a = 7.0/4.0
>>>b = 7/4
>>>print a == b

Untuk program di atas, output akan False in Python 2.7 dan True in Python 3.3.

Dalam Python 2.7 a = 1.75 dan b = 1.

Dalam Python 3.3 a = 1.75 dan b = 1.75, hanya karena /merupakan divisi float.

Harsha Vardhan
sumber
8

Ini ada hubungannya dengan versi python yang Anda gunakan. Pada dasarnya ia mengadopsi perilaku C: jika Anda membagi dua bilangan bulat, hasilnya akan dibulatkan menjadi bilangan bulat. Perlu diingat juga bahwa Python melakukan operasi dari kiri ke kanan, yang berperan saat Anda mengetik.

Contoh: Karena ini adalah pertanyaan yang selalu muncul di kepala saya ketika saya melakukan operasi aritmatika (harus saya konversi menjadi float dan nomor mana), sebuah contoh dari aspek tersebut disajikan:

>>> a = 1/2/3/4/5/4/3
>>> a
0

Ketika kita membagi bilangan bulat, tidak mengherankan jika itu semakin rendah.

>>> a = 1/2/3/4/5/4/float(3)
>>> a
0.0

Jika kita mengetikkan bilangan bulat terakhir ke float, kita masih akan mendapatkan nol, karena pada saat angka kita dibagi dengan float sudah menjadi 0 karena pembagian bilangan bulat.

>>> a = 1/2/3/float(4)/5/4/3
>>> a
0.0

Skenario yang sama seperti di atas tetapi menggeser typecast float sedikit lebih dekat ke sisi kiri.

>>> a = float(1)/2/3/4/5/4/3
>>> a
0.0006944444444444445

Akhirnya, ketika kita mengetikkan bilangan bulat pertama ke float, hasilnya adalah yang diinginkan, sejak mulai dari divisi pertama, yaitu yang paling kiri, kita menggunakan float.

Ekstra 1: Jika Anda mencoba menjawabnya untuk meningkatkan evaluasi aritmatika, Anda harus memeriksa ini

Tambahan 2: Harap berhati-hati dengan skenario berikut:

>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0
George
sumber
4

Menentukan float dengan menempatkan '.' setelah nomor tersebut juga akan menyebabkannya default untuk mengambang.

>>> 1 / 2
0

>>> 1. / 2.
0.5
BillH
sumber
2

Buat setidaknya salah satu dari mereka mengambang, maka itu akan menjadi divisi mengambang, bukan bilangan bulat:

>>> (20.0-10) / (100-10)
0.1111111111111111

Casting hasil untuk mengapung sudah terlambat.

unbeli
sumber
1

Dalam python cv2tidak memperbarui perhitungan pembagian. jadi, Anda harus memasukkan from __future__ import division di baris pertama program.

Kavitha Raj
sumber
0

Either way, itu adalah pembagian bilangan bulat. 10/90 = 0. Dalam kasus kedua, Anda hanya melemparkan 0 ke float.

Coba gunakan salah satu operan "/" untuk menjadi float:

float(20-10) / (100-10)
Fred Larson
sumber
0

Anda ingin mengapung setelah pembagian telah terjadi dalam contoh kedua Anda. Coba ini:

float(20-10) / float(100-10)
David M.
sumber
0

Saya agak terkejut bahwa tidak ada yang menyebutkan bahwa poster asli mungkin menyukai angka yang rasional . Jika Anda tertarik dengan ini, program Sage berbasis Python mendukung Anda . (Saat ini masih berbasis pada Python 2.x, meskipun 3.x sedang berjalan.)

sage: (20-10) / (100-10)
1/9

Ini bukan solusi untuk semua orang, karena memang melakukan beberapa persiapan sehingga angka-angka ini bukan ints, tetapi Integerelemen kelas Sage . Namun, layak disebut sebagai bagian dari ekosistem Python.

kcrisman
sumber
0

Secara pribadi saya lebih suka memasukkan 1. *di awal. Jadi ungkapannya menjadi seperti ini:

1. * (20-10) / (100-10)

Seperti yang selalu saya lakukan pembagian untuk beberapa formula seperti:

accuracy = 1. * (len(y_val) - sum(y_val)) / len(y_val)

jadi tidak mungkin hanya menambahkan .0like 20.0. Dan dalam kasus saya, membungkus dengan float()dapat kehilangan sedikit keterbacaan.

Fred Kami
sumber