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?
python
math
python-2.x
Adam Nelson
sumber
sumber
Jawaban:
Anda menggunakan Python 2.x, di mana divisi integer akan terpotong alih-alih menjadi angka floating point.
Anda harus membuat salah satunya
float
:atau
from __future__ import division
, yang memaksa/
untuk mengadopsi perilaku Python 3.x yang selalu mengembalikan float.sumber
from __future__ import division
Anda bisa mendapatkan perilaku pembagian gaya-C lama dengan menggunakan dua garis miring (mis.1 // 2
Akan menghasilkan 0). Lihat Pep 238 Mengubah Operator Divisi__future__
. Baik dalam Python 2 dan 3//
mengacu__floordiv__()
secara default.Anda memasukkan Integer sehingga Python memberi Anda integer kembali :
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.
Jadi dalam kasus Anda:
sumber
Anda perlu mengubahnya menjadi pelampung SEBELUM Anda melakukan pembagian. Itu adalah:
sumber
Dalam Python 2.7,
/
operator adalah divisi bilangan bulat jika input bilangan bulat:Dalam Python 3.3,
/
operator adalah divisi float bahkan jika inputnya bilangan bulat.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:
Sekarang, lihat perbandingannya
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.sumber
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:
Ketika kita membagi bilangan bulat, tidak mengherankan jika itu semakin rendah.
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.
Skenario yang sama seperti di atas tetapi menggeser typecast float sedikit lebih dekat ke sisi kiri.
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:
sumber
Menentukan float dengan menempatkan '.' setelah nomor tersebut juga akan menyebabkannya default untuk mengambang.
sumber
Buat setidaknya salah satu dari mereka mengambang, maka itu akan menjadi divisi mengambang, bukan bilangan bulat:
Casting hasil untuk mengapung sudah terlambat.
sumber
Dalam python
cv2
tidak memperbarui perhitungan pembagian. jadi, Anda harus memasukkanfrom __future__ import division
di baris pertama program.sumber
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:
sumber
Anda ingin mengapung setelah pembagian telah terjadi dalam contoh kedua Anda. Coba ini:
sumber
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.)
Ini bukan solusi untuk semua orang, karena memang melakukan beberapa persiapan sehingga angka-angka ini bukan
int
s, tetapiInteger
elemen kelas Sage . Namun, layak disebut sebagai bagian dari ekosistem Python.sumber
Secara pribadi saya lebih suka memasukkan
1. *
di awal. Jadi ungkapannya menjadi seperti ini:Seperti yang selalu saya lakukan pembagian untuk beberapa formula seperti:
jadi tidak mungkin hanya menambahkan
.0
like20.0
. Dan dalam kasus saya, membungkus denganfloat()
dapat kehilangan sedikit keterbacaan.sumber