Ich habe kürzlich bemerkt, dass int()
ein Float in Richtung 0 gerundet wird, während eine Ganzzahldivision einen Float in Richtung seines Bodens rundet.
zum Beispiel:
-7 // 2 = -4
int(-7/2) = -3
Ich habe die Dokumentation gelesen, in der Folgendes angegeben ist:
Klasse int (x, Basis = 10)
Gibt ein ganzzahliges Objekt zurück, das aus einer Zahl oder Zeichenfolge x aufgebaut ist, oder gibt 0 zurück, wenn keine Argumente angegeben sind. Wenn x eine Zahl ist, geben Sie x zurück. int (). Bei Gleitkommazahlen wird dies gegen Null abgeschnitten.
und:
Bodenteilung
Mathematische Division, die auf die nächste ganze Zahl abgerundet wird. Der Floor Division Operator ist //. Zum Beispiel ergibt der Ausdruck 11 // 4 2 im Gegensatz zu 2,75, die von float true Division zurückgegeben werden. Beachten Sie, dass (-11) // 4 -3 ist, da dies -2,75 nach unten gerundet ist. Siehe PEP 238.
Für mich erscheint es jedoch unlogisch, dass zwei ähnliche Operationen (Float-Division zu Integer) unterschiedliche Ergebnisse liefern sollten.
Gibt es eine Motivation für die Unterschiede zwischen den Funktionen?
Vielen Dank.
quelle
Antworten:
Konsistenz.
Sie müssen einige sehr grundlegende und scheinbar irrelevante Erklärungen befolgen, um es zu verstehen.
In der Schule haben Sie mit einem Rest Teilung gelernt. Und Sie haben folgende Berechnungen durchgeführt:
Später haben Sie Divisionen für reelle Zahlen gelernt:
Bis zu diesem Punkt könnten Sie das glauben
x // 4
undint(x/4)
immer das gleiche Ergebnis erzielen. Das ist Ihr aktuelles Verständnis der Situation.Schauen Sie sich jedoch an, was in der Ganzzahldivision passiert: Die Zahl hinter R wechselt von 3, 2, 1 bis 0 und startet dann neu: 3, 2, 1, 0. Die Zahl vor dem R wird bei jedem vierten Schritt verringert.
Also, wie wird es weitergehen?
Gleichzeitig gibt uns die reelle Zahlenteilung:
Deshalb
-1 // 4
gibt -1, aberint(-1/4)
0.Nun, sie dienen verschiedenen Zwecken: Sie
//
sind Teil einer Ganzzahlberechnung mit Resten undint()
geben Ihnen den Teil vor.
einer reellen Zahlenoperation.Sie entscheiden, was Sie berechnen möchten, und dann, welchen Operator Sie in Python verwenden möchten, um das richtige Ergebnis zu erhalten.
Gute Frage. Lerne weiter.
quelle
//
Operators in Python 3 darin, die Verwendung von int (float) nicht zu erzwingen. Wenn dies nicht der Fall ist, wann sollte ich mich für die Implementierung mit entscheidenint()
und wann sollte ich mit implementieren//
Math.Floor(3.23) != -Math.Floor(-3.23)
Aus dem gleichen Grund-((-x)//y)
muss nicht gleich seinx//y
.Ich würde sagen, dass Ihre Beobachtung, dass diese beiden Operationen intuitiv ähnlich sein sollten, erwartet wird, da sie sich bei positiven Zahlen identisch verhalten. Aber wenn man sich ihre Ursprünge ansieht (einer stammt aus der Mathematik und der andere aus der Informatik), dann macht es mehr Sinn, dass sie sich unterschiedlich verhalten.
Sie können hinter diese Konzepte schauen:
================================================== ================
I) Bodenteilung, auch bekannt als die Bodenfunktion, die auf die mathematische Division angewendet wird
Die Bodenfunktion ist ein sehr gut etabliertes Konzept in der Mathematik.
Von mathworld.wolfram :
Die Bodenteilung ist also nichts anderes als eine Bodenfunktion, die auf die mathematische Division angewendet wird. Das Verhalten ist sehr klar, "mathematisch präzise".
II) Typumwandlung / Typguss
Aus Wikipedia :
In den meisten Programmiersprachen wird die Casting-Form float to integer durch eine Rundungsregel angewendet (es gibt also eine Konvention):
Rundungsregel nach IEEE 754 .
Mit anderen Worten, der Grund für den Unterschied zwischen der Ganzzahldivision und der Umwandlung von Float in Int in Python ist ein mathematischer. Hier einige Gedanken von Guido van Rossum (ich glaube, ich muss ihn nicht vorstellen: D) (aus dem Blog Die Geschichte von Python, Artikel "Warum Pythons Integer Division Floors" )
quelle