Mini-JS a_Nombres
Les nombres en JavaScript
En JavaScript, il n’existe qu’un seul type de nombre : les
flottants 64 bits.
Cela signifie qu’il n’y a pas de différence entre un
entier et un nombre décimal : tout est stocké de la même
manière en mémoire.
Autrement dit, que vous écriviez 42 ou
3.14, il s’agit toujours du même type :
number.
Ce choix de conception simplifie le langage, mais entraîne aussi
des particularités qu’il faut bien comprendre.
let entier = 42;
let decimal = 3.14;
console.log(entier); // 42
console.log(decimal); // 3.14Équivalence et précision
Contrairement à d’autres langages qui distinguent plusieurs
catégories (int, float,
double), JavaScript ne fait aucune
différence entre 1 et 1.0.
console.log(1 === 1.0); // trueC’est une simplification bienvenue, mais elle a un coût : comme tout est stocké en flottant 64 bits, la précision est limitée. En pratique, JavaScript ne peut garantir que 15 à 17 chiffres significatifs.
Cela entraîne parfois des résultats inattendus, surtout avec les nombres décimaux :
console.log(0.1 + 0.2); // 0.30000000000000004Ici, le résultat n’est pas exactement 0.3 car le
binaire, qui est la base du fonctionnement des ordinateurs, ne
peut pas représenter certains nombres décimaux de façon parfaite.
De la même manière qu’en décimal on ne peut pas écrire 1/3
exactement (0.3333…), en binaire certains nombres n’ont pas de
représentation finie.
Nombres spéciaux
JavaScript définit aussi des valeurs particulières qui
appartiennent au type number :
console.log(1 / 0); // Infinity
console.log(-1 / 0); // -Infinity
console.log(0 / 0); // NaN (Not a Number)Infinity et -Infinity représentent
respectivement l’infini positif et négatif.
NaN signifie Not a Number. C’est le
résultat d’une opération qui n’a pas de sens mathématique, comme
0 / 0 ou "abc" * 5.
!!! Attention !!! : NaN est contagieux. Toute
opération impliquant NaN donnera
NaN.
Bases différentes
JavaScript permet de représenter les nombres dans plusieurs systèmes de numération.
- Décimal : la base habituelle (ex.
42). - Hexadécimal : préfixé par
0x(ex.0xFF→ 255). - Binaire : préfixé par
0b(ex.0b1010→ 10). - Octal : préfixé par
0o(ex.0o12→ 10).
let hex = 0xFF; // 255 en hexadécimal
let bin = 0b1010; // 10 en binaire
let oct = 0o12; // 10 en octal
console.log(hex, bin, oct);Ces notations sont pratiques, surtout dans le domaine des
systèmes, des algorithmes bas-niveau ou pour manipuler des
couleurs (#FF0000 en hexadécimal = rouge).
Limites numériques
L’objet Number met à disposition plusieurs
constantes utiles pour connaître les limites de ce qui peut être
représenté en JavaScript :
console.log(Number.MAX_VALUE); // plus grand nombre représentable
console.log(Number.MIN_VALUE); // plus petit nombre positif (≈ 5e-324)
console.log(Number.MAX_SAFE_INTEGER); // plus grand entier sûr (≈ 9e15)
console.log(Number.MIN_SAFE_INTEGER); // plus petit entier sûr (≈ -9e15)Les entiers sûrs sont ceux qui peuvent être représentés exactement sans perte de précision.
Au-delà de ces bornes, JavaScript risque d’arrondir ou d’approximer.
Comment bien travailler avec les nombres ?
- Accepter la limite de précision : JavaScript n’est pas fait pour des calculs scientifiques extrêmement précis. Pour cela, on utilise des bibliothèques spécialisées (BigInt, decimal.js…).
- Se méfier de
NaN: toujours vérifier vos calculs si un résultat inattendu apparaît. - Utiliser les bonnes conversions :
parseInt,parseFloatetNumber()permettent de transformer des chaînes en nombres.
Exercice
- Crée deux variables
aetbcontenant respectivement0.1et0.2. Additionne-les et affiche le résultat. Explique pourquoi le résultat n’est pas exactement0.3. - Déclare un nombre en binaire (
0b1011) et affiche sa valeur décimale. - Trouve le plus grand entier sûr avec
Number.MAX_SAFE_INTEGER. Ajoute1puis2et observe le résultat.
À retenir
- En JavaScript, il n’existe qu’un seul type de nombre : les flottants 64 bits.
- Tous les nombres (entiers ou décimaux) sont du type
number. - La précision est limitée à 15-17 chiffres
significatifs, d’où des résultats étranges comme
0.1 + 0.2. - Des valeurs spéciales existent :
NaN,Infinity,-Infinity. - Les nombres peuvent être exprimés en décimal, hexadécimal, binaire et octal.
- L’objet
Numberfournit des constantes commeMAX_VALUEetMAX_SAFE_INTEGERpour connaître les limites.