L'objet Math de JavaScript est la ceinture utilitaire discrète du langage. Vous ne l'instanciez jamais. Vous ne l'importez jamais. Il existe tout simplement dans chaque environnement d'exécution, prêt à tout gérer, du simple arrondi d'une valeur de pixel à la génération d'un lancer de dés aléatoire. Comme Math est un objet statique, chaque méthode et propriété est directement rattachée à l'espace de noms. Vous écrivez Math.PI, et non new Math().PI. Ce choix de conception simplifie les choses, mais cela signifie également que l'objet présente quelques subtilités qu'il vaut mieux comprendre avant de s'appuyer sur lui pour une logique de production.

Un objet statique sans constructeur

La plupart des objets intégrés de JavaScript souhaitent que vous créiez une instance. Vous appelez new Date() ou new Array(). Math refuse. Il est conçu comme un espace de noms de fonctions et de constantes liées qui opèrent sur le type primitif Number. Appelez Math.sqrt(16) et vous obtenez 4. Essayez d'utiliser le mot-clé new et le moteur renvoie une TypeError. Ce modèle permet de garder la mémoire propre et signale que Math est purement fonctionnel. Il prend des entrées, renvoie des sorties et ne mute rien.

Il y a une limitation stricte à mémoriser : Math fonctionne avec les nombres standards IEEE 754. Il ne fonctionne pas avec BigInt. Passez un BigInt à Math.round() ou Math.abs() et vous obtiendrez une TypeError. Si votre application traite des entiers de 64 bits ou plus, vous devez soit convertir la valeur vers le bas, soit gérer l'arithmétique avec les opérateurs BigInt natifs à la place.

Les constantes que vous utilisez réellement

L'objet Math expose plusieurs constantes numériques qui vous évitent de coder en dur des « nombres magiques ».

  • Math.PI est le célèbre 3,14159..., essentiel pour tout ce qui implique des cercles, de la trigonométrie ou la conversion de degrés en radians.
  • Math.E est le nombre d'Euler, environ 2,718. Il apparaît dans les courbes de croissance exponentielle, les calculs d'intérêts composés et les échelles logarithmiques.
  • Math.SQRT2 est la racine carrée de deux, environ 1,414. Elle est pratique lorsque vous avez besoin de la diagonale d'un carré ou que vous souhaitez normaliser des vecteurs en géométrie simple.
  • Math.LN2 est le logarithme naturel de 2, environ 0,693. Vous rencontrerez cela dans les algorithmes traitant des arbres binaires, de l'entropie de l'information ou de l'analyse de la complexité temporelle impliquant des calculs en log de base 2.

Ces valeurs sont des nombres flottants en double précision. Comme ce sont des propriétés et non des méthodes, vous y accédez sans parenthèses.

Arrondis, signes et valeurs absolues

Les tâches Math les plus courantes consistent à nettoyer un nombre. JavaScript vous propose quatre méthodes d'arrondi, et elles ne se comportent pas de la même manière, surtout une fois que vous quittez le domaine des nombres positifs.

Math.abs(x) renvoie la magnitude d'un nombre. Passez-lui -42 et vous obtenez 42. C'est utile lorsque vous vous intéressez à la distance plutôt qu'à la direction. Pensez à la comparaison de timestamps, au calcul de deltas de déplacement dans une interface utilisateur ou à la vérification si une estimation se situe dans une marge d'erreur.

Math.round(x) est l'arrondi scolaire. Il prend l'entier le plus proche, en arrondissant les demi-unités à l'entier positif supérieur. Ainsi, 4,4 devient 4 et 4,5 devient 5.

Math.ceil(x) arrondit toujours vers le haut, vers l'entier supérieur. 4,1 devient 5, et -4,9 devient -4. Ce dernier point surprend souvent. Comme -4 est supérieur à -4,9 sur la droite numérique, le plafond (ceiling) se rapproche de zéro pour les nombres négatifs.

Math.floor(x) est l'inverse. Il arrondit toujours vers le bas. 4,9 devient 4, et -4,1 devient -5. Si vous paginez des résultats de recherche ou allouez des blocs de mémoire de taille fixe, floor est généralement ce dont vous avez besoin.

Math.trunc(x) supprime entièrement la partie décimale, ne laissant que la partie entière. En effet, il se rapproche de zéro quel que soit le signe. 4,9 devient 4, et -4,9 devient -4. Si vous portez de la logique provenant de langages qui convertissent les flottants en entiers par troncature, c'est votre allié.

Enfin, Math.sign(x) vous indique de quel côté de zéro se trouve une valeur. Il renvoie 1 pour le positif, -1 pour le négatif, 0 pour le zéro positif, -0 pour le zéro négatif, et NaN pour tout ce qui n'est pas un nombre. C'est une façon concise de créer des branches selon la direction sans écrire une chaîne if-else.

Générer des nombres aléatoires

Math.random() produit un nombre flottant pseudo-aléatoire de 0 (inclus) à 1 (exclus). Il n'est pas cryptographiquement sécurisé, ne l'utilisez donc pas pour la génération de mots de passe, la création de jetons (tokens) ou tout ce qui implique de l'argent réel.