Bagaimana saya bisa memaksa pembagian menjadi titik mengambang di Python?
Saya memiliki dua nilai integer a dan b, tetapi saya perlu rasio mereka di floating point. Saya tahu bahwa <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 menjadi angka floating point dalam Python di berikut ini?
c = a / b
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
.
>>> 1/2
0.5
Divisi lantai, perilaku divisi klasik untuk bilangan bulat, sekarang a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
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:
from __future__ import division
yang kemudian menerapkan pembagian gaya Python 3 ke seluruh modul. Ia juga bekerja di shell python pada titik tertentu. Dengan Python 2:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
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:
>>> 1/(2 * 1.0)
0.5
Juga kuat truediv
dari operator
modul operator.truediv(a, b)
, tetapi ini kemungkinan lebih lambat karena itu adalah panggilan fungsi:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
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.
>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float
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:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j