Integer-division & modulo-operation mit negativen Operanden in Python
Fragen geben, wenn ich in diese Ausdrücke Python 3.3.0
-10 // 3 # -4
-10 % 3 # 2
10 // -3 # -4
10 % -3 # -2
-10 // -3 # 3
Scheint es, als ob es nimmt die Ungefähre floating point (-3.33)? und Runden, die sich entweder die Art und Weise, in integer-division, aber in der modulo-operation ist es etwas ganz anderes. Es scheint, wie es gibt den Rest +/-1 und wechselt nur das Vorzeichen, je nachdem, wo die negativen Operanden ist. Ich bin völlig verwirrt, auch nach der Suche über andere Antworten auf dieser Seite! Ich hoffe mir kann jemand eindeutig erklären, dies auch zu mir! Das Buch sagt Tipp: recall-diese Magische Formel a = (a//b)(b)+(a%b), aber das scheint nicht zu klares Wasser für mich.
-Vielen Dank im Voraus!
Edit: das sind nur meine persönlichen Einschätzungen, was passiert (siehe oben), ich weiß, ich bin völlig aus!
- mögliche Duplikate von negative zahlen in python
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die integer-division ist nur unter dem Boden von der Zahl, die am Ende.
(Warum es Etagen)
Die modulo-operation auf der anderen Seite ist nach der mathematische definition.
a = (a //b) * b + (a % b)
a: -10
b: 3
a //b: -4
a % b: 2
Ersatz in Magische Formel:
-10 = -4 * 3 + 2 = -12 + 2 = -10
a: 10
b: -3
a //b: -4
a % b: -2
In Magische Formel:
10 = -4 * -3 - 2 = 12 - 2 = 10
Also die Magische Formel scheint richtig zu sein.
Wenn Sie definieren
a //b
alsfloor(a /b)
(was es ist),a % b
solltea - floor(a /b) * b
. Mal sehen:a: -10
b: 3
a % b = a - floor(a /b) * b = -10 - floor(-3.33) * 3 = -10 + 4 * 3 = 2
Die Tatsache, dass
a //b
ist immer Platt ist ziemlich leicht zu merken (bitte Lesen Cthulhu ersten link, es ist eine Erklärung, die der Schöpfer von Python). Für negativea
ima % b
.. versuchen Sie, stellen Sie sich eine Tabelle von zahlen, beginnt an0
und hatb
Spalten:Wenn
a
ist die Zahl in eine Zelle,a % b
wäre die Spalte Nummer:Erweitern nun die Tabelle wieder in die negativen:
-10 % 3
wäre2
. Negativea
ima % b
kommen würde, diese Art von Kontext.a % b
mit negativenb
kommen nicht viel.50 % 13 = 11
,-50 % 13 = 2
(Sie können spiegeln nur die Zeichen von 11 oder 2 bei -13 obwohl). Sie müssen geistig teilen Sie die Anzahl line-inb
-großen Blöcken. Danna % b
ist die position desa
in einem block. Blick auf diese Grafiken, auf wikipedia. Wir haben die Platt-division.Eine einfache Regel: für
a % b = c
, wennc
ist nicht null, dann sollte die gleichen Vorzeichen wieb
.Und Anwendung der magischen Formel:
10 % -3 = -2
=>10 //-3 = (10 - (-2)) /(-3) = -4
-10 % 3 = 2
=>-10 //3 = (-10 - 2) /3 = -4
-10 % -3 = -1
=>-10 //-3 = (-10 - (-1)) /(-3) = 3
divmod(x, y) == (x//y, x%y)
OK, also ich habe einige Graben und ich denke, dass das problem nicht von Python, sondern die Modulo-Funktion. Ich bin stützen diese Antwort aus der http://mathforum.org/library/drmath/view/52343.html
10 % 3 Verwendet das höchste Vielfache von 3, das ist WENIGER ALS 10. In diesem Fall, 9. 10 - 9 = 1
-10 % 3 nicht die gleiche Sache. Es ist immer noch auf der Suche für ein Vielfaches von 3 ist KLEINER ALS -10. In diesem Fall, -12. (-10) - (-12) = 2