Mam dwie wartości całkowite a
i b
, ale potrzebuję ich stosunku w liczbach zmiennoprzecinkowych. Wiem o tym 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ć się c
do bycia liczbą zmiennoprzecinkową w Pythonie poniżej?
c = a / b
python
floating-point
integer
division
python-2.x
Nathan Fellman
źródło
źródło
Odpowiedzi:
W Pythonie 2 podział dwóch liczb całkowitych tworzy liczbę całkowitą. W Pythonie 3 tworzy liczbę zmiennoprzecinkową. Nowe zachowanie możemy uzyskać, importując z
__future__
.źródło
from __future__ import division
musi być na samym początku pliku//
kiedy chcesz podzielić podłogę i/
kiedy chcesz „prawdziwego” (float
) podziału.Możesz rzucić na pływaka, wykonując
c = a / float(b)
. Jeśli licznik lub mianownik jest liczbą zmiennoprzecinkową, wówczas wynik również będzie.Zastrzeżenie: jak zauważyli komentatorzy, to nie zadziała, jeśli
b
może być czymś innym niż liczba całkowita lub liczba zmiennoprzecinkowa (lub ciąg reprezentujący jeden). Jeśli masz do czynienia z innymi typami (takimi jak liczby zespolone), musisz je sprawdzić lub użyć innej metody.źródło
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
.Podział podłogi, klasyczne zachowanie podziału na liczby całkowite, jest teraz
a // b
: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:
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:
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:Solidny jest
truediv
równieżoperator
modułoperator.truediv(a, b)
, ale jest to prawdopodobnie wolniejsze, ponieważ jest to wywołanie funkcji: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.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ć:źródło
źródło
W Pythonie 3.x pojedynczy ukośnik (
/
) zawsze oznacza prawdziwy (nie obcięty) podział. (//
Operator służy do obcinania podziału.) W Pythonie 2.x (2.2 i nowszych) można uzyskać to samo zachowanie, umieszczającu góry modułu.
źródło
Samo wykonanie dowolnego parametru do podziału w formacie zmiennoprzecinkowym powoduje również wygenerowanie wyniku w zmiennoprzecinkowym.
Przykład:
lub,
lub,
lub,
źródło
1.0 + 1/3
lubfloat(c) + a/b
lubfloat(a/b)
i będziesz rozczarowany odpowiedzią. Lepiej użyć Pythona 3+ lub zaimportować__future__.division
moduł (patrz zaakceptowana odpowiedź), aby zawsze uzyskać oczekiwaną odpowiedź. Istniejące reguły podziału powodują podstępny, trudny do wyśledzenia błąd matematyczny.python -c 'a=10; b=3.0; print a/b'
?a
i „b”, na przykład, są wyjściami funkcji wartości całkowitych? Npa = len(list1), b = len(list2)
.float(..)
. Myślę, że mnożenie przez1.0
, jak sugeruje @ Pinochle poniżej, może być również przydatne.Dodaj kropkę (
.
), aby wskazać liczby zmiennoprzecinkoweźródło
float()
jednej ze zmiennych.To też zadziała
źródło
a
ib
../
jest poprawnym operatorem w pythonie, który pozwala na dzielenie zmiennoprzecinkowe. Dlatego dobrze jest rozsądnie wykorzystywać białeJeśli chcesz domyślnie używać podziału „prawda” (zmiennoprzecinkowa), dostępna jest flaga wiersza polecenia:
Istnieją pewne wady (z PEP):
Możesz dowiedzieć się więcej o innych wartościach flag, które zmieniają / ostrzegają o zachowaniu dzielenia, patrząc na stronę podręcznika Pythona.
Aby uzyskać szczegółowe informacje na temat zmian podziału, przeczytaj: PEP 238 - Zmiana operatora podziału
źródło
źródło
a
gdy intb
jest i jest zmiennoprzecinkowe. Lepszym rozwiązaniem według tych samych zasad jest zrobienie,from operator import truediv
a następnie użycietruediv(a, b)
.gdzie a jest dywidendą, a b jest dzielnikiem. Ta funkcja jest przydatna, gdy iloraz po podzieleniu dwóch liczb całkowitych jest liczbą zmiennoprzecinkową.
źródło