HOWTO · JavaScript
Ganzzahldivision in JavaScript
Wählen Sie in JavaScript Math.trunc oder Math.floor, damit Quotient und Rest auch bei negativen Werten korrekt berechnet werden.
Auf dieser Seite
JavaScript hat keinen Ganzzahldivisionsoperator //. Verwenden Sie für gewöhnliche Number-Werte Math.trunc(dividend / divisor), wenn der Quotient seinen Nachkommateil in Richtung null verlieren soll, und % für den Rest. Wählen Sie Math.floor() nur, wenn Abrunden tatsächlich die gewünschte Regel ist. Bei negativen Werten unterscheiden sich diese Entscheidungen, daher ist die Regel wichtiger als eine kurze Schreibweise.
Direkte Antwort: Abschneiden oder Abrunden wählen
Ganzzahldivision kann zwei Bedeutungen haben. Ein abschneidender Quotient entfernt die Nachkommastellen: Math.trunc(-13 / 5) ergibt -2. Ein abgerundeter Quotient rundet gegen minus unendlich: Math.floor(-13 / 5) ergibt -3. Bei positiven Eingaben liefern beide 2; dadurch bleibt der Unterschied oft bis zum ersten negativen Produktionswert verborgen.
Verwenden Sie Abschneiden, wenn eine vorzeichenbehaftete Größe in Quotient und vorzeichenbehafteten Rest zerlegt wird. Nutzen Sie Floor-Division etwa für nullbasierte Gruppen oder zyklische Indizes, bei denen der Quotient stets abrunden muss. Der JavaScript-Operator % liefert einen Rest, kein immer nichtnegatives mathematisches Modulo; sein Vorzeichen folgt dem Dividenden. MDN unterscheidet Restoperator und mathematisches Modulo.
Empfohlener Number-Quotient und Rest
Für endliche Number-Eingaben machen Math.trunc und % die Beziehung zwischen Quotient und Rest deutlich. Das ist der empfohlene Weg für gewöhnliche Ganzzahldivision. Prüfen Sie vor der Berechnung, ob der Divisor null ist: Ein von vorzeichenbehafteter null geteiltes Number ungleich null erzeugt vorzeichenbehaftetes Infinity, während 0 / 0 und ein Number-Rest mit Divisor null NaN ergeben. Die ECMAScript-Spezifikation definiert diese Divisions- und Restfälle.
const dividend = 13;
const divisor = 5;
console.log(`quotient: ${Math.trunc(dividend / divisor)}`);
console.log(`remainder: ${dividend % divisor}`);
quotient: 2
remainder: 3
Der Rest hilft auch beim Prüfen: Bei ganzzahligen Eingaben gilt dividend gleich divisor * quotient + remainder. Diese Beziehung ist für die Validierung nützlich; den Quotienten mit Math.trunc zu berechnen, zeigt die gewünschte Rundungsregel jedoch klarer als eine indirekte Herleitung.
Negative Operanden und vorzeichenbehafteter Rest
Negative Operanden markieren die Grenze zwischen Abschneiden und Floor-Semantik. Bei -13 / 5 liefert Abschneiden -2, Floor-Division dagegen -3. Das Ergebnis von % ist -3, weil JavaScript bei einem Rest ungleich null das Vorzeichen des Dividenden beibehält. Keine der Operationen schlägt bei negativen Eingaben fehl; sie beantworten lediglich unterschiedliche Fragen.
const dividend = -13;
const divisor = 5;
console.log(`truncating quotient: ${Math.trunc(dividend / divisor)}`);
console.log(`floor quotient: ${Math.floor(dividend / divisor)}`);
console.log(`remainder: ${dividend % divisor}`);
truncating quotient: -2
floor quotient: -3
remainder: -3
Wenn Floor-Division oder Modulo erforderlich ist
Benötigt die Anwendung bei positivem Divisor ein nichtnegatives Modulo, normalisieren Sie den Rest, statt dieses Verhalten bei % vorauszusetzen. Kombinieren Sie es mit Math.floor, damit beide Werte dieselbe Floor-Division-Konvention verwenden. Das folgende Beispiel passt zu einem Zyklus mit fünf Elementen, nicht zu jeder Quotient/Rest-Aufgabe.
const dividend = -13;
const divisor = 5;
const quotient = Math.floor(dividend / divisor);
const modulo = ((dividend % divisor) + divisor) % divisor;
console.log(`floor quotient: ${quotient}`);
console.log(`non-negative modulo: ${modulo}`);
floor quotient: -3
non-negative modulo: 2
Diese Normalisierung setzt einen positiven Divisor voraus. Definieren und testen Sie die gewünschte Konvention separat, wenn ein Divisor negativ sein kann.
Große exakte Ganzzahlen mit BigInt
Number verwendet IEEE-754-Gleitkommawerte. Außerhalb des Bereichs sicherer Ganzzahlen kann es nicht jede Ganzzahl exakt darstellen; prüfen Sie daher exakte Eingaben mit Number.isSafeInteger, bevor Sie sich auf einen Number-Quotienten oder -Rest verlassen. Für größere exakte Ganzzahlen verwenden Sie durchgehend BigInt. Die BigInt-Division schneidet Richtung null ab, und ihr Rest folgt derselben Idee eines vorzeichenbehafteten Rests.
const dividend = 13n;
const divisor = 5n;
console.log(`quotient: ${dividend / divisor}`);
console.log(`remainder: ${dividend % divisor}`);
try {
13n / 0n;
} catch (error) {
console.log(`zero divisor: ${error.name}`);
}
try {
13n / 5;
} catch (error) {
console.log(`mixed types: ${error.name}`);
}
quotient: 2
remainder: 3
zero divisor: RangeError
mixed types: TypeError
Mischen Sie Number- und BigInt-Operanden nicht; konvertieren Sie bewusst vor der Arithmetik. Ein BigInt-Divisor null löst RangeError aus, anders als ein Number-Divisor null, daher bleibt Eingabevalidierung in beiden Fällen sinnvoll. MDN dokumentiert BigInt-Division, Fehler bei gemischten Typen und das Verhalten bei Divisor null.
Warum keine bitweise Umwandlung oder parseInt
Vielleicht sehen Sie ~~value oder value | 0 als kurze Abschneide-Redewendung. Vermeiden Sie diese Formen für allgemeine Ganzzahldivision: Bitweise Operatoren wandeln in eine vorzeichenbehaftete 32-Bit-Ganzzahl um und ändern daher Werte außerhalb dieses Bereichs. parseInt analysiert Zeichenketten; es ist keine API zum numerischen Runden. MDN erläutert Math.trunc und den Unterschied zur bitweisen Umwandlung. Der folgende Vergleich zeigt die 32-Bit-Grenze und das legitime Parsen von Zeichenketten.
const value = 2 ** 32 + 1;
console.log(`Math.trunc: ${Math.trunc(value)}`);
console.log(`~~value: ${~~value}`);
console.log(`value | 0: ${value | 0}`);
console.log(`parseInt("13.8", 10): ${parseInt("13.8", 10)}`);
Math.trunc: 4294967297
~~value: 1
value | 0: 1
parseInt("13.8", 10): 13
Verwenden Sie Math.trunc für einen numerischen Number-Wert und parseInt(text, 10) nur, wenn die Eingabe zu parsende Zeichenfolge ist. Keine der Kurzformen behebt Gleitkommagenauigkeit; nutzen Sie BigInt, wenn exakte Arithmetik mit großen Ganzzahlen erforderlich ist.
Entscheidungshilfe und Einschränkungen
Verwenden Sie für die übliche JavaScript-Ganzzahldivision Math.trunc(a / b) und a % b. Nutzen Sie Math.floor(a / b) mit normalisiertem Modulo nur, wenn Floor-Semantik nötig ist. Verwenden Sie BigInt für exakte große Ganzzahlen, weisen Sie einen Divisor null zurück und mischen Sie BigInt und Number nie in einer Operation. Vermeiden Sie bitweise Umwandlung und parseInt als allgemeine Alternativen, weil sie andere Probleme lösen.