Python'da bölünmeyi kayan nokta olmaya nasıl zorlayabilirim?
İki tamsayı a ve b var, ancak kayan noktadaki oranlarına ihtiyacım var. Ben a <b ve ben a / b hesaplamak istiyorum biliyorum, bu yüzden eğer tamsayı bölümü kullanırsanız her zaman bir geri kalanı ile 0 alırsınız.
Aşağıda c'yi Python'da kayan nokta sayısı olmaya nasıl zorlayabilirim?
c = a / b
Burada gerçekten sorulan şey:
"Gerçek bölünmeyi a / b
kesir döndürecek şekilde nasıl zorlarım?"
Python 3'e yükseltme
Python 3'te, gerçek bölünme elde etmek için yapmanız yeterlidir a / b
.
>>> 1/2
0.5
Tamsayılar için klasik bölme davranışı olan kat bölümü şimdi a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
Ancak, Python 2 ile sıkışmış olabilir veya hem 2 hem de 3'te çalışması gereken bir kod yazıyor olabilirsiniz.
Python 2 Kullanıyorsanız
Python 2'de bu o kadar basit değil. Klasik Python 2 bölümüyle baş etmenin bazı yolları diğerlerinden daha iyi ve daha sağlamdır.
Python 2 için öneri
Python 3 bölüm davranışını, aşağıdaki içe aktarma işlemi üstte olacak şekilde herhangi bir modülde alabilirsiniz:
from __future__ import division
daha sonra tüm modüle Python 3 stil bölümü uygulanır. Ayrıca herhangi bir noktada bir python kabuğunda çalışır. Python 2'de:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
Modülünüzdeki kodun Python 3 ile daha ileri uyumlu olmasını sağladığından bu gerçekten en iyi çözümdür.
Python 2 için diğer seçenekler
Bunu tüm modüle uygulamak istemiyorsanız, birkaç geçici çözümle sınırlısınız. En popüler olanı, işlenenlerden birini bir şamandıraya zorlamaktır. Sağlam bir çözüm a / (b * 1.0)
. Taze bir Python kabuğunda:
>>> 1/(2 * 1.0)
0.5
Ayrıca sağlamdır truediv
gelen operator
modül operator.truediv(a, b)
, ama bir işlev çağrısı çünkü bu büyük olasılıkla yavaştır:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
Python 2 için Önerilmez
Yaygın olarak görülür a / float(b)
. B karmaşık bir sayı ise TypeError değerini yükseltir. Karmaşık sayılarla bölme tanımlandığından, bölen için karmaşık bir sayıyı geçtiğinde bölme işleminin başarısız olması bana mantıklı geliyor.
>>> 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
Kodunuzu bilerek daha kırılgan hale getirmek benim için çok mantıklı değil.
Python'u -Qnew
bayrakla da çalıştırabilirsiniz , ancak bunun tüm modülleri yeni Python 3 davranışı ile yürütmenin dezavantajı vardır ve bazı modülleriniz klasik bölme bekleyebilir, bu yüzden test dışında bunu önermiyorum. Ama göstermek için:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j