Saya memiliki dua nilai integer a
dan b
, tetapi saya perlu rasio mereka di floating point. Saya tahu itu a < b
dan saya ingin menghitung a / b
, jadi jika saya menggunakan divisi integer saya akan selalu mendapatkan 0 dengan sisa a
.
Bagaimana saya bisa memaksa c
untuk menjadi nomor floating point di Python di berikut ini?
c = a / b
python
floating-point
integer
division
python-2.x
Nathan Fellman
sumber
sumber
Jawaban:
Dalam Python 2, pembagian dua int menghasilkan int. Dalam Python 3, ini menghasilkan pelampung. Kita bisa mendapatkan perilaku baru dengan mengimpor dari
__future__
.sumber
from __future__ import division
harus di bagian paling awal file//
ketika Anda ingin pembagian lantai, dan/
ketika Anda inginfloat
divisi "true" ( ).Anda dapat melemparkan untuk mengapung dengan melakukan
c = a / float(b)
. Jika pembilang atau penyebutnya adalah float, maka hasilnya juga akan menjadi.Peringatan: seperti yang ditunjukkan oleh komentator, ini tidak akan berhasil jika
b
mungkin bukan angka integer atau floating-point (atau string yang mewakili satu). Jika Anda mungkin berurusan dengan tipe lain (seperti bilangan kompleks) Anda harus memeriksa atau menggunakan metode yang berbeda.sumber
Apa yang sebenarnya ditanyakan di sini adalah:
"Bagaimana saya memaksa pembagian yang benar sehingga
a / b
akan menghasilkan sebagian kecil?"Tingkatkan ke Python 3
Di Python 3, untuk mendapatkan pembagian yang benar, Anda cukup melakukannya
a / b
.Divisi lantai, perilaku divisi klasik untuk bilangan bulat, sekarang
a // b
:Namun, Anda mungkin terjebak menggunakan Python 2, atau Anda mungkin menulis kode yang harus bekerja di kedua 2 dan 3.
Jika Menggunakan Python 2
Dalam Python 2, ini tidak sesederhana itu. Beberapa cara berurusan dengan divisi Python 2 klasik lebih baik dan lebih kuat daripada yang lain.
Rekomendasi untuk Python 2
Anda bisa mendapatkan perilaku divisi Python 3 di modul mana pun dengan impor berikut di atas:
yang kemudian menerapkan pembagian gaya Python 3 ke seluruh modul. Ia juga bekerja di shell python pada titik tertentu. Dengan Python 2:
Ini benar-benar solusi terbaik karena memastikan kode di modul Anda lebih maju kompatibel dengan Python 3.
Opsi lain untuk Python 2
Jika Anda tidak ingin menerapkan ini ke seluruh modul, Anda terbatas pada beberapa solusi. Yang paling populer adalah memaksa salah satu operan ke float. Salah satu solusi tangguh adalah
a / (b * 1.0)
. Dalam kulit Python segar:Juga kuat
truediv
darioperator
moduloperator.truediv(a, b)
, tetapi ini kemungkinan lebih lambat karena itu adalah panggilan fungsi:Tidak Direkomendasikan untuk Python 2
Yang biasa dilihat adalah
a / float(b)
. Ini akan menaikkan TypeError jika b adalah bilangan kompleks. Karena pembagian dengan bilangan kompleks didefinisikan, masuk akal bagi saya untuk tidak mengalami kegagalan pembagian ketika melewati bilangan kompleks untuk pembagi.Tidak masuk akal bagi saya untuk sengaja membuat kode Anda lebih rapuh.
Anda juga dapat menjalankan Python dengan
-Qnew
flag, tetapi ini memiliki kelemahan menjalankan semua modul dengan perilaku Python 3 yang baru, dan beberapa modul Anda mungkin mengharapkan pembagian klasik, jadi saya tidak merekomendasikan ini kecuali untuk pengujian. Tetapi untuk menunjukkan:sumber
sumber
Dalam Python 3.x, slash tunggal (
/
) selalu berarti pembagian true (non-truncating). (//
Operator digunakan untuk memotong divisi.) Dalam Python 2.x (2.2 dan di atas), Anda bisa mendapatkan perilaku yang sama dengan meletakkandi bagian atas modul Anda.
sumber
Hanya membuat salah satu parameter untuk pembagian dalam format floating-point juga menghasilkan output dalam floating-point.
Contoh:
atau,
atau,
atau,
sumber
1.0 + 1/3
ataufloat(c) + a/b
ataufloat(a/b)
dan Anda akan kecewa dengan jawabannya. Lebih baik menggunakan python 3+ atau mengimpor__future__.division
modul, (lihat jawaban yang diterima), untuk selalu mendapatkan jawaban yang Anda harapkan. Aturan pembagian yang ada membuat kesalahan matematika yang sulit dilacak.python -c 'a=10; b=3.0; print a/b'
?a
dan 'b', misalnya, apakah output dari fungsi nilai integer? Misalnyaa = len(list1), b = len(list2)
,.float(..)
. Saya pikir mengalikan dengan1.0
, seperti yang disarankan @Pinochle di bawah ini, juga bisa bermanfaat.Tambahkan titik (
.
) untuk menunjukkan angka floating pointsumber
float()
salah satu variabel.Ini juga akan berfungsi
sumber
a
danb
../
adalah operator yang sah dalam python yang memungkinkan Anda untuk melakukan pembagian floating point. Inilah sebabnya mengapa baik menggunakan ruang kosong secara bijaksana, dalam bahasa pemrograman apa punJika Anda ingin menggunakan divisi "true" (floating point) secara default, ada flag baris perintah:
Ada beberapa kekurangan (dari PEP):
Anda dapat mempelajari lebih lanjut tentang nilai-nilai flag lainnya yang mengubah / memperingatkan-tentang perilaku pembagian dengan melihat halaman python man.
Untuk detail lengkap tentang perubahan divisi, baca: PEP 238 - Mengubah Operator Divisi
sumber
sumber
a
int danb
float. Solusi yang lebih baik di sepanjang garis yang sama adalah melakukanfrom operator import truediv
dan kemudian menggunakantruediv(a, b)
.di mana a adalah dividen dan b adalah pembagi. Fungsi ini berguna ketika hasil bagi setelah pembagian dua bilangan bulat adalah pelampung.
sumber