Math n'est pas une classe et ne s'instancie pas. C'est une boîte à outils posée à disposition, dont on appelle directement les fonctions. Sur un projet web ordinaire, quatre ou cinq d'entre elles suffisent à couvrir tous les besoins.
Le reste vaut surtout d'être connu de nom : logarithmes, trigonométrie, racines. On les cherche le jour où l'on en a besoin, on ne les apprend pas par cœur.
Définition
Math est un objet natif qui expose des constantes et des fonctions mathématiques. Toutes ses propriétés sont statiques : on écrit Math.round(x), jamais new Math(), et l'opérateur new produit d'ailleurs une erreur sur lui.
console.log(Math.round(2.5)); // 3
console.log(Math.floor(2.9)); // 2, vers le bas
console.log(Math.ceil(2.1)); // 3, vers le haut
console.log(Math.trunc(-2.7)); // -2, coupe la partie décimale
console.log(Math.max(3, 9, 1)); // 9
console.log(Math.abs(-4)); // 4Les quatre façons d'arrondir
Elles se ressemblent et ne donnent pas le même résultat sur les négatifs, ce qui est la source d'erreurs la plus fréquente.
| Fonction | Sur 2.5 | Sur -1.5 | Comportement |
|---|---|---|---|
Math.round | 3 | -1 | Au plus proche, les demis vers le haut |
Math.floor | 2 | -2 | Toujours vers le bas |
Math.ceil | 3 | -1 | Toujours vers le haut |
Math.trunc | 2 | -1 | Retire la partie décimale |
Math.round(-1.5) vaut -1 et non -2, parce que la règle est « vers le haut » et non « vers la valeur la plus grande en valeur absolue ». Sur des durées ou des soldes négatifs, c'est exactement le genre de détail qui décale un total.
Ces fonctions renvoient un nombre, contrairement à toFixed qui renvoie une chaîne. Pour arrondir à deux décimales en restant numérique : Math.round(x * 100) / 100.
Le tirage aléatoire
Math.random() renvoie un décimal entre 0 inclus et 1 exclu. Tout tirage se construit à partir de là.
// Un entier entre 1 et 6
const de = Math.floor(Math.random() * 6) + 1;
// Un élément au hasard dans un tableau
const options = ["a", "b", "c"];
const choix = options[Math.floor(Math.random() * options.length)];
console.log(de, choix);Le Math.floor est indispensable : sans lui, l'index serait décimal et le tableau renverrait undefined. Notez aussi que ce tirage n'est pas cryptographique. Pour un jeton de sécurité, il faut crypto.randomUUID() ou crypto.getRandomValues().
Questions fréquentes
Comment trouver le maximum d'un tableau ?
Math.max attend des arguments séparés, pas une liste. Il faut donc l'étaler avec Spread (...) : Math.max(...valeurs). Attention sur un tableau vide, où l'appel renvoie -Infinity, ce qui passe inaperçu jusqu'à ce qu'un affichage devienne incohérent.
Pourquoi mon arrondi à deux décimales est-il parfois faux ?
Parce que le nombre de départ n'est déjà pas exact. Math.round(1.005 * 100) / 100 donne 1 et non 1.01, car 1.005 * 100 vaut en réalité un peu moins de 100,5. Le terme Number (nombre) explique cette limite des flottants et la parade, qui consiste à travailler en entiers.
Y a-t-il un opérateur pour les puissances ?
Oui, ** est arrivé en 2016 et fait la même chose que Math.pow : 2 ** 10 et Math.pow(2, 10) valent tous deux 1024. L'opérateur est plus lisible dans une formule, la fonction reste utile quand la puissance est passée en argument à une autre fonction.