Zauważyłem niedawno, że int()
zaokrągla liczbę zmiennoprzecinkową w kierunku 0, podczas gdy dzielenie liczb całkowitych zaokrągla liczbę zmiennoprzecinkową w kierunku jej podłogi.
na przykład:
-7 // 2 = -4
int(-7/2) = -3
Przeczytałem dokumentację, która określa:
klasa int (x, podstawa = 10)
Zwraca liczbę całkowitą zbudowaną z liczby lub łańcucha x lub zwraca 0, jeśli nie podano> argumentów. Jeśli x jest liczbą, zwróć x. int (). W przypadku liczb zmiennoprzecinkowych powoduje to skrócenie do zera.
i:
podział podłogi
Podział matematyczny zaokrąglany w dół do najbliższej liczby całkowitej. Operatorem podziału podłogi jest //. Na przykład wyrażenie 11 // 4 ma wartość 2 w przeciwieństwie do 2,75 zwróconego przez zmiennoprzecinkowe dzielenie rzeczywiste. Zauważ, że (-11) // 4 to -3, ponieważ jest to -2,75 zaokrąglone w dół. Zobacz PEP 238.
Ale wydaje mi się nielogiczne, że 2 podobne operacje (dzielenie zmiennoprzecinkowe na liczbę całkowitą) powinny zwracać różne wyniki.
Czy jest jakaś motywacja do różnic między funkcjami?
Dziękuję Ci.
źródło
Odpowiedzi:
Konsystencja.
Będziesz musiał zastosować się do kilku bardzo podstawowych i pozornie nieistotnych wyjaśnień, aby to zrozumieć.
W szkole nauczyłeś się podziału z resztą. Dokonałeś takich obliczeń:
Później nauczyłeś się podziałów na liczby rzeczywiste:
Do tego momentu możesz w to uwierzyć
x // 4
iint(x/4)
zawsze dawać ten sam rezultat. To twoje obecne zrozumienie sytuacji.Zobacz jednak, co dzieje się w dzieleniu liczb całkowitych: liczba za R zmienia się z 3, 2, 1 na 0, a następnie uruchamia się ponownie: 3, 2, 1, 0. Liczba przed R zmniejsza się co 4 stopień.
Jak to będzie dalej?
Jednocześnie podział liczb rzeczywistych daje nam:
Dlatego
-1 // 4
daje -1, aleint(-1/4)
daje 0.Cóż, służą one różnym celom:
//
są częścią obliczania liczb całkowitych z resztami iint()
dają ci część przed.
operacją na liczbach rzeczywistych.Ty decydujesz, co chcesz obliczyć, a następnie decydujesz, którego operatora użyć w Pythonie, aby uzyskać poprawny wynik.
Dobre pytanie. Ucz się dalej.
źródło
//
operatora w pythonie 3 ma na celu uniknięcie wymuszania użycia int (float). Jeśli tak nie jest, kiedy powinienem wdrożyć za pomocą,int()
a kiedy powinienem za pomocą//
Math.Floor(3.23) != -Math.Floor(-3.23)
tego samego powodu-((-x)//y)
nie musi być równyx//y
.Powiedziałbym, że spodziewana jest twoja obserwacja, że te 2 operacje powinny być intuicyjnie podobne, ponieważ przy liczbach dodatnich zachowują się identycznie. Ale jeśli spojrzysz na ich pochodzenie (jedno pochodzi z matematyki, a drugie z informatyki), to bardziej sensowne jest ich odmienne zachowanie.
Możesz poszukać pojęć:
================================================== ================
I) Podział podłogi, czyli funkcja podłogi zastosowana do podziału matematycznego
Funkcja podłogi jest bardzo dobrze ugruntowaną koncepcją w matematyce.
From mathworld.wolfram :
Podział podłogi jest więc niczym więcej niż funkcją podłogi zastosowaną do podziału matematycznego. Zachowanie jest bardzo jasne, „matematycznie precyzyjne”.
II) Konwersja typu / casting typu
Z wikipedii :
W większości języków programowania forma rzutowania float na liczba całkowita jest stosowana przez regułę zaokrąglania (istnieje więc konwencja):
Reguła zaokrąglania zgodna z IEEE 754 .
Innymi słowy, przyczyną różnicy między dzieleniem liczb całkowitych a konwersją liczb zmiennoprzecinkowych do int w pythonie jest matematyka, oto kilka myśli Guido van Rossuma (chyba nie muszę go przedstawiać: D) (z blog Historia Pythona, artykuł „Dlaczego podłogi Integer Division Pythona” )
źródło