Ich habe in Python ein seltsames Verhalten in Bezug auf negative Zahlen festgestellt:
>>> -5 % 4
3
Könnte jemand erklären, was los ist?
python
modulo
negative-number
facha
quelle
quelle
..., -9, -5, -1, 3, 7, ...
math.fmod
das gleiche Verhalten wie in C oder Java verwenden.Antworten:
Im Gegensatz zu C oder C ++ gibt Pythons Modulo-Operator (
%
) immer eine Zahl mit dem gleichen Vorzeichen wie der Nenner (Divisor) zurück. Ihr Ausdruck ergibt 3, weilEs wird dem C-Verhalten vorgezogen, da ein nicht negatives Ergebnis oft nützlicher ist. Ein Beispiel ist die Berechnung von Wochentagen. Wenn heute Dienstag (Tag 2) ist, was ist der Wochentag N Tage zuvor? In Python können wir mit berechnen
aber in C, wenn N ≥ 3 ist, erhalten wir eine negative Zahl, die eine ungültige Zahl ist, und wir müssen sie manuell korrigieren, indem wir 7 hinzufügen:
(Unter http://en.wikipedia.org/wiki/Modulo_operator erfahren Sie, wie das Vorzeichen des Ergebnisses für verschiedene Sprachen bestimmt wird.)
quelle
Hier ist eine Erklärung von Guido van Rossum:
http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html
Im Wesentlichen ist es so, dass a / b = q mit dem Rest r die Beziehungen b * q + r = a und 0 <= r <b beibehält.
quelle
a
, positivb
, während Python-Stockwerke. Es ist immer wahrabs(r) < b
, und sie decken iffr <= 0
.Es gibt keinen besten Weg, um mit Ganzzahldivision und Mods mit negativen Zahlen umzugehen. Es wäre schön, wenn
a/b
es die gleiche Größe und das entgegengesetzte Vorzeichen von wäre(-a)/b
. Es wäre schön, wenna % b
es tatsächlich ein Modulo b wäre. Da wir wirklich wollena == (a/b)*b + a%b
, sind die ersten beiden nicht kompatibel.Welche zu behalten ist, ist eine schwierige Frage, und es gibt Argumente für beide Seiten. C und C ++ runden die Ganzzahldivision gegen Null (so
a/b == -((-a)/b)
), und Python anscheinend nicht.quelle
Wie bereits erwähnt, macht Python modulo eine gut begründete Ausnahme von den Konventionen anderer Sprachen.
Dies gibt negativen Zahlen ein nahtloses Verhalten, insbesondere wenn sie in Kombination mit dem
//
Integer-Divide-Operator verwendet werden, wie es%
Modulo häufig ist (wie in math. Divmod ):Produziert:
%
gibt immer Null oder Positiv aus, wenn der Divisor positiv ist//
rundet immer in Richtung negative Unendlichkeitquelle
In Python funktioniert der Modulo-Operator folgendermaßen.
Das Ergebnis ist also (für Ihren Fall):
Während andere Sprachen wie C, JAVA und JavaScript die Kürzung anstelle von Floor verwenden.
was in ... endet:
Wenn Sie weitere Informationen zum Runden in Python benötigen, lesen Sie diese .
quelle
Modulo, Äquivalenzklassen für 4:
Hier ist ein Link zu Modulos Verhalten mit negativen Zahlen . (Ja, ich habe gegoogelt)
quelle
Ich dachte auch, dass es ein seltsames Verhalten von Python war. Es stellt sich heraus, dass ich die Trennung nicht gut gelöst habe (auf dem Papier); Ich gab dem Quotienten einen Wert von 0 und dem Rest einen Wert von -5. Schrecklich ... Ich habe die geometrische Darstellung von Ganzzahlen vergessen. Durch Abrufen der Geometrie der Ganzzahlen, die durch die Zahlenlinie angegeben werden, können die korrekten Werte für den Quotienten und den Rest ermittelt und überprüft werden, ob das Verhalten von Python in Ordnung ist. (Obwohl ich davon ausgehe, dass Sie Ihr Problem bereits vor langer Zeit gelöst haben).
quelle
Erwähnenswert ist auch, dass sich auch die Unterteilung in Python von C: Consider unterscheidet
in C erwarten Sie das Ergebnis
Was ist x / y in Python?
und% ist modulo - nicht der Rest! Während x% y in C ergibt
Python ergibt.
Sie können beide wie in C erhalten
Der Unternehmensbereich:
Und der Rest (unter Verwendung der Unterteilung von oben):
Diese Berechnung ist möglicherweise nicht die schnellste, funktioniert jedoch für alle Vorzeichenkombinationen von x und y, um die gleichen Ergebnisse wie in C zu erzielen. Außerdem werden bedingte Anweisungen vermieden.
quelle