Jak zmusić dzielenie do zmiennoprzecinkowego w Pythonie?
Mam dwie wartości całkowite a i b, ale potrzebuję ich stosunku w zmiennoprzecinkowej. Wiem, że a <b i chcę obliczyć a / b, więc jeśli użyję dzielenia liczb całkowitych, zawsze otrzymam 0 z resztą a.
Jak mogę zmusić c do bycia liczbą zmiennoprzecinkową w Pythonie?
c = a / b
Tak naprawdę pyta się tutaj:
„Jak wymusić prawdziwy podział, który a / b
zwróci ułamek?”
Uaktualnij do Python 3
W Pythonie 3, aby uzyskać prawdziwy podział, wystarczy a / b
.
>>> 1/2
0.5
Podział podłogi, klasyczne zachowanie podziału na liczby całkowite, jest teraz a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
Możesz jednak utknąć w Pythonie 2 lub pisać kod, który musi działać zarówno w 2, jak i 3.
Jeśli używasz języka Python 2
W Pythonie 2 nie jest to takie proste. Niektóre sposoby radzenia sobie z klasycznym działem Python 2 są lepsze i bardziej niezawodne niż inne.
Zalecenie dla Python 2
Możesz uzyskać zachowanie podziału Python 3 w dowolnym module z następującym importem u góry:
from __future__ import division
który następnie stosuje podział stylu Python 3 na cały moduł. Działa również w powłoce pytona w dowolnym punkcie. W Python 2:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
To jest naprawdę najlepsze rozwiązanie, ponieważ zapewnia, że kod w twoim module jest bardziej zgodny z Pythonem 3.
Inne opcje dla Python 2
Jeśli nie chcesz zastosować tego do całego modułu, ograniczasz się do kilku obejść. Najpopularniejszym jest zmuszenie jednego z operandów do wypłynięcia. Jednym z solidnych rozwiązań jest a / (b * 1.0)
. W nowej powłoce Pythona:
>>> 1/(2 * 1.0)
0.5
Solidny jest truediv
również operator
moduł operator.truediv(a, b)
, ale jest to prawdopodobnie wolniejsze, ponieważ jest to wywołanie funkcji:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
Niezalecane dla Python 2
Powszechnie widziany jest a / float(b)
. To spowoduje podniesienie błędu typu, jeśli b jest liczbą zespoloną. Ponieważ podział z liczbami zespolonymi jest zdefiniowany, dla mnie sensowne jest, aby brak podziału nie powiódł się po przekazaniu liczby zespolonej dla dzielnika.
>>> 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
Celowe zwiększenie kruchości kodu nie ma dla mnie sensu.
Możesz również uruchomić Python z -Qnew
flagą, ale ma to wadę wykonywania wszystkich modułów za pomocą nowego zachowania Python 3, a niektóre z twoich modułów mogą oczekiwać klasycznego podziału, więc nie polecam tego poza testowaniem. Ale aby zademonstrować:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j