Der Stackoverflow Beitrag, den ich verlinkt habe, führt die Unterschiede ja auch aus. Aber evtl. war es nicht deutlich genug.
Folgenden Blog-Eintrag habe ich gefunden, der es auch erklärt:
A remainder and a modulus look so very similar, but they are not the same thing and worse, are treated differently by different programming languages. Do you know how your language handles mod?
rob.conery.io
You may have read that JavaScript’s % operator is a remainder operator, not a modulo operator. This blog post explains what that means.
2ality.com
Falsch, 10 % -3 gibt -2.
10 remainder -3 gibt 1
Das ist so nicht ganz durchdacht. % ist ja der remainder (in Java aber auch in C98 so ich mich jetzt nicht irre). Da hättest du besser mod statt % geschrieben.
Da Modulo und Remainder bei positiven Zahlen das gleiche Ergebnis liefern, wird dies gerne durcheinander geworfen. Aber das ist nicht korrekt, denn sobald die Vorzeichen unterschiedlich sind, kommen unterschiedliche Ergebnisse raus.
Die Berechnung beruht ja etwas wie:
a % b
-> es wird erst a/b gerechnet. Das Ergebnis ist dann aber nur ein Ganzwert -> Hier kommen wir dann gleich drauf zurück.
-> dann wird a - Ergebnis * b gerechnet.
Also bei dem Beispiel 10 / -3 = -3,33333333....
Hier können wir nun Math.floor oder Math.trunc/umwandlung in int nutzen. Also die -4 oder eine -3
Bei Remainder wird das trunc genommen. Daher ist es -3 und es kommt die 1.
Bei Modulo wird das floor genommen und damit die -4 und 10 - (-4)*(-3) = -2
Das wäre dann auch noch einmal die Erläuterung.
Und das dies so bei Modulo ist, kann man ansonsten auch nachvollziehen z.B. auf Wikipedia:
de.wikipedia.org
Das entscheidende ist dabei:
Die
Gaußklammer {\displaystyle \lfloor \cdot \rfloor }
bezeichnet die größte ganze Zahl, die nicht größer als die Zahl in der Gaußklammer ist
und somit schlicht das Math.floor.