387 Stimmen

JavaScript % (modulo) ergibt ein negatives Ergebnis für negative Zahlen

Nach Angaben von Google-Rechner (-13) % 64 es 51 .

Laut Javascript (siehe dies JSBin ) es ist -13 .

Wie kann ich das beheben?

381voto

Enrique Punkte 9426
Number.prototype.mod = function (n) {
  "use strict";
  return ((this % n) + n) % n;
};

Diesem Artikel entnommen: Der JavaScript-Modulo-Bug

258voto

StuR Punkte 11682

Verwendung von Number.prototype ist LANGSAM, denn jedes Mal, wenn Sie die Prototyp-Methode verwenden, wird Ihre Zahl in eine Object . Stattdessen:

Number.prototype.mod = function(n) {
  return ((this % n) + n) % n;
}

Verwendung:

function mod(n, m) {
  return ((n % m) + m) % m;
}

Ver: http://jsperf.com/negative-modulo/2

~97% schneller als bei Verwendung des Prototyps. Wenn Leistung für Sie natürlich wichtig ist

40voto

Rob Sobers Punkte 19859

En % Operator in JavaScript ist der Restwert-Operator, nicht der Modulo-Operator (der Hauptunterschied besteht darin, wie negative Zahlen behandelt werden):

-1 % 8 // -1, not 7

23voto

Shanimal Punkte 11276

Eine "mod"-Funktion, die ein positives Ergebnis liefert.

var mod = function (n, m) {
    var remain = n % m;
    return Math.floor(remain >= 0 ? remain : remain + m);
};
mod(5,22)   // 5
mod(25,22)  // 3
mod(-1,22)  // 21
mod(-2,22)  // 20
mod(0,22)   // 0
mod(-1,22)  // 21
mod(-21,22) // 1

Und natürlich

mod(-13,64) // 51

15voto

wisbucky Punkte 26902

Die akzeptierte Antwort macht mich ein wenig nervös, weil sie den %-Operator wieder verwendet. Was ist, wenn Javascript das Verhalten in der Zukunft ändert?

Hier ist eine Umgehung, bei der % nicht wiederverwendet wird:

function mod(a, n) {
    return a - (n * Math.floor(a/n));
}

mod(1,64); // 1
mod(63,64); // 63
mod(64,64); // 0
mod(65,64); // 1
mod(0,64); // 0
mod(-1,64); // 63
mod(-13,64); // 51
mod(-63,64); // 1
mod(-64,64); // 0
mod(-65,64); // 63

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