HOWTO · JavaScript

Opérateur modulo(%) en JavaScript

Ce didacticiel explique comment utiliser l'opérateur modulo(%) dans JavaScript.

Sur cette page

L’opérateur % de JavaScript renvoie le reste d’une division. Pour les valeurs positives, ce résultat correspond souvent à ce que l’on appelle le modulo. Avec un dividende négatif, la différence apparaît : le reste obtenu avec JavaScript a le signe du dividende. Ce guide présente la syntaxe, les cas numériques particuliers et les usages courants.

Ce que renvoie l’opérateur % de JavaScript

Pour des nombres finis, a % b renvoie le reste après troncature du quotient a / b vers zéro. Dans 10 % 3, le quotient vaut 3 et le reste vaut 1. Le résultat suit le signe du dividende (a) : ainsi, -10 % 3 vaut -1. Cette règle explique pourquoi % en JavaScript est un opérateur de reste et ne produit pas toujours le résultat non négatif du modulo mathématique.

Syntaxe et exemples de base

Écrivez le dividende, puis %, puis le diviseur : dividend % divisor. L’opérateur accepte des opérandes numériques, y compris des fractions. Dans l’expression, la valeur de gauche est divisée par celle de droite ; le résultat est un nombre que votre code peut stocker, comparer ou transmettre à un autre calcul. L’exemple affecte chaque résultat à une constante nommée, puis affiche les deux valeurs dans la console :

const wholeRemainder = 10 % 3;
const fractionalRemainder = 5.5 % 2;
console.log(wholeRemainder);
console.log(fractionalRemainder);

Le premier résultat vaut 1 ; le second vaut 1.5, car 2 tient deux fois dans 5.5, avec 1.5 restant. L’exécution fournie confirme ces deux résultats : 1 et 1.5.

Nombres négatifs et cas limites

Le reste a le signe du dividende : 10 % 3 vaut 1, -10 % 3 vaut -1 et 10 % -3 vaut 1. Une division exacte avec un dividende négatif peut produire un zéro négatif, comme dans -4 % 2 ; utilisez Object.is(-4 % 2, -0) pour le détecter lorsque son signe importe.

JavaScript renvoie NaN si l’un des opérandes est NaN, si le dividende est infini ou si le diviseur vaut 0 ou -0. Avec un dividende fini et un diviseur infini, le résultat est le dividende lui-même : 5 % Infinity vaut donc 5. Ces résultats découlent des règles numériques du reste en JavaScript ; ils n’ont pas été observés lors d’une exécution fournie avec ce paquet.

Usages courants de l’opérateur %

Pour des entrées entières, on peut tester la parité avec n % 2 === 0 pour un nombre pair et n % 2 !== 0 pour un nombre impair. Cela fonctionne aussi avec les entiers négatifs, dont le reste vaut 0 ou -1. Si l’entrée peut être une fraction ou une chaîne représentant un nombre, validez-la ou normalisez-la avant d’effectuer un test de parité destiné aux entiers.

Pour un nombre fini, value % 1 donne le reste fractionnaire signé. Par exemple, 5.5 % 1 vaut 0.5, tandis que -5.5 % 1 vaut -0.5. Pour obtenir une partie fractionnaire positive avec des valeurs négatives, choisissez une règle de normalisation explicite au lieu de supposer que % 1 est toujours non négatif.

Pour un nombre entier de minutes supérieur ou égal à zéro, hours = Math.floor(minutes / 60) et remainingMinutes = minutes % 60 répartissent la durée en heures et en minutes. Par exemple, 135 minutes correspondent à 2 heures et 15 minutes.

Pour exécuter une action à chaque troisième passage dans une boucle, testez i % 3 === 0. Pour alterner entre deux entrées d’un tableau, utilisez (round - 1) % players.length lorsque round commence à 1 ; la soustraction de un fait commencer le premier tour à l’index 0. Ces motifs supposent respectivement un intervalle positif et un tableau non vide.

Reste et modulo mathématique

Le modulo mathématique renvoie généralement une valeur comprise entre 0 inclus et un modulo positif exclu. L’opérateur % de JavaScript conserve plutôt le signe du dividende : -10 % 3 vaut donc -1. Pour un modulo positif fini n, l’expression ((a % n) + n) % n normalise une valeur finie a afin d’obtenir un résultat de type modulo non négatif. Par exemple, avec un modulo de 3, elle transforme -10 en 2. Précisez bien l’hypothèse du modulo positif : cette formule ne remplace pas % de façon générale pour des diviseurs quelconques.