17 Stimmen

Unterschied zwischen Modulus-Implementierung in Python und Java

Ich habe festgestellt, dass der Modulus-Operator in Python und Java unterschiedlich implementiert ist.

Zum Beispiel in Python:

>>> print -300 % 800
>>> 500

In Java hingegen:

System.out.println(-300 % 800);
-300

Das hat mich überrascht, da ich dachte, dass etwas so Grundlegendes wie der Modulus allgemein auf die gleiche Weise interpretiert wird. Ich bin ein Fan der Python-Interpretation (die, wie ich annehme, von C entlehnt ist), obwohl ich die Logik hinter der Java-Implementierung verstehe.

Welche bevorzugen Sie normalerweise? Gibt es einen bestimmten Grund für die unterschiedlichen Interpretationen? Ich habe nicht die Absicht, einen Sprachenkrieg anzuzetteln, ich bin nur neugierig.

6voto

Alex Martelli Punkte 805329

Ich bevorzuge die Interpretation von C (die auch in Python verwendet wird), wo % ist in der Tat ein Modulus-Operator. Gute Diskussion in der Wikipedia-Seite und die darin enthaltenen Links (einschließlich eines Hinweises darauf, warum das Vorzeichen der Dividende zu einem dummen Fehler führen kann, wenn man nicht vorsichtig ist;-).

4voto

Bill the Lizard Punkte 384619

Versuchen Sie dies:

>>> print 300 % -800
-500

Der Grund für den Unterschied ist, dass die Sprachdesigner sich nicht entscheiden können, ob der Rest nach der Division das Vorzeichen der Dividende oder die Divisor . In einigen Sprachen ist weder das eine noch das andere festgelegt, so dass es dem Implementierer überlassen bleibt.

Es gibt eine Liste der Sprachen, den Operator und das zu erwartende Zeichen auf der Modulo-Operation Wikipedia-Seite. Das ist ein guter Anfang, aber ich führe normalerweise nur ein paar einfache Tests durch, um sicherzustellen, dass ich genau weiß, wie % verhalten wird, bevor ich sie in einer Sprache verwende, in der ich sie noch nicht getestet habe.

1voto

Jeffrey Aylesworth Punkte 7838

Im C-Standard ist negatives Modulo undefiniert, und viele C-Compiler geben Ihnen das, was Java Ihnen gibt. In Python erhalten Sie jedoch immer eine positive Zahl, was oft nützlicher ist, weil Sie damit Modulo-Addition und -Subtraktion durchführen können. Wenn man bei negativem Modulo eine negative Zahl erhält, würde es nicht richtig funktionieren.

Ich habe keine Ahnung, welche Vorteile es hat, bei einem Modulo eine negative Zahl zu erhalten.

0voto

Rex Kerr Punkte 164629

Ich bevorzuge x mod n um Zahlen zwischen 0 und n-1 oder zwischen floor(n/2)-n und floor(n/2) anzugeben; das macht es am einfachsten, die Berechnung im Kopf durchzuführen.

Solange alles gleichwertig ist, ist es mir eigentlich egal, wenn es um Sprachen geht - obwohl man sich der Konvention bewusst sein muss.

Übrigens kann sich Java nicht ganz entscheiden - % auf negative Ganzzahlen gibt einen negativen Wert zurück, die mod Methode der java.math.BigInteger gibt Werte zwischen 0 und n-1 (einschließlich) zurück, und die divideAndRemainder Methode gibt wiederum negative Werte für negative ganze Zahlen zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X