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?

9voto

Roko C. Buljan Punkte 178158

Fixes negatives Modulo (Erinnerungsoperator % )

Vereinfacht mit der ES6-Funktion Arrow und ohne gefährliche Erweiterung des Prototyps Number

const mod = (n, m) => (n % m + m) % m;

console.log(mod(-90, 360));    //  270  (Instead of -90)

8voto

quasimodo Punkte 2770

Wenn x eine ganze Zahl ist und n eine Potenz von 2 ist, können Sie x & (n - 1) anstelle von x % n .

> -13 & (64 - 1)
51

5voto

dheerosaur Punkte 13811

Auch wenn es sich nicht so verhält, wie Sie es erwartet haben, heißt das nicht, dass JavaScript sich nicht "verhält". Es ist eine Entscheidung, die JavaScript für seine Modulo-Berechnung getroffen hat. Denn per Definition ist jede Antwort sinnvoll.

Véase este aus Wikipedia. Auf der rechten Seite sehen Sie, wie die verschiedenen Sprachen das Zeichen des Ergebnisses gewählt haben.

4voto

zessx Punkte 66708

Dies ist kein Fehler, es gibt 3 Funktionen, um Modulo zu berechnen, Sie können diejenige verwenden, die Ihren Bedürfnissen entspricht (ich würde empfehlen, die Euklidische Funktion zu verwenden)

Funktion zum Abschneiden des Dezimalteils

console.log(  41 %  7 ); //  6
console.log( -41 %  7 ); // -6
console.log( -41 % -7 ); // -6
console.log(  41 % -7 ); //  6

Ganzzahlige Teilfunktion

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

console.log( parseInt( 41).mod( 7) ); //  6
console.log( parseInt(-41).mod( 7) ); //  1
console.log( parseInt(-41).mod(-7) ); // -6
console.log( parseInt( 41).mod(-7) ); // -1

Euklidische Funktion

Number.prototype.mod = function(n) {
    var m = ((this%n)+n)%n;
    return m < 0 ? m + Math.abs(n) : m;
};

console.log( parseInt( 41).mod( 7) ); // 6
console.log( parseInt(-41).mod( 7) ); // 1
console.log( parseInt(-41).mod(-7) ); // 1
console.log( parseInt( 41).mod(-7) ); // 6

2voto

JayCrossler Punkte 1979

Wenn Sie also versuchen, die Gradzahl zu ändern (wenn Sie also -50 Grad - 200 Grad haben), sollten Sie etwas wie "-50 Grad - 200 Grad" verwenden:

function modrad(m) {
    return ((((180+m) % 360) + 360) % 360)-180;
}

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