Découvrez BigInt de JavaScript pour gérer les grands nombres avec précision. Apprenez les opérations arithmétiques, les limites et les cas d'utilisation réels.
Arithmétique BigInt en JavaScript : Calculs sur les grands nombres et gestion de la précision
Par défaut, JavaScript utilise le type de données Number pour représenter les valeurs numériques. Bien qu'adéquat pour de nombreux cas d'utilisation, le type Number a des limites pour représenter avec précision de très grands entiers en raison de son format sous-jacent à virgule flottante double précision (IEEE 754). Cela peut entraîner une perte de précision et des résultats inattendus lors du traitement de nombres dépassant son entier sûr maximal (Number.MAX_SAFE_INTEGER), qui est de 253 - 1.
C'est là qu'intervient BigInt, un type de données JavaScript intégré, introduit dans ES2020, conçu spécifiquement pour représenter des entiers de longueur arbitraire. BigInt vous permet d'effectuer des opérations arithmétiques sur des nombres extrêmement grands sans perte de précision. Cela ouvre des possibilités pour les calculs dans des domaines tels que la cryptographie, le calcul scientifique et les applications financières où la précision est primordiale.
Qu'est-ce que BigInt ?
BigInt est un type de données primitif qui représente des nombres entiers plus grands que ce que le type Number peut gérer avec précision. Contrairement à Number, les BigInts n'ont pas de taille fixe, ce qui signifie qu'ils peuvent s'adapter à n'importe quel entier, limité uniquement par la mémoire disponible.
Créer des BigInts
Il existe deux manières principales de créer des BigInts en JavaScript :
- Ajouter
n
à un littéral entier : C'est la méthode la plus simple. Ajoutez simplement le suffixe 'n' à la fin d'un nombre. Par exemple :12345678901234567890n
. - Utiliser le constructeur
BigInt()
: Vous pouvez utiliser le constructeurBigInt()
pour convertir un Number, une chaîne de caractères ou un autre BigInt en une valeur BigInt. Par exemple :BigInt(12345)
ouBigInt("12345678901234567890")
. Notez que la conversion d'un nombre à virgule flottante en BigInt tronquera la partie décimale ; elle n'arrondit pas.
Exemple :
const largeNumberLiteral = 9007199254740991n; // En utilisant le suffixe 'n'
const largeNumberConstructor = BigInt(9007199254740991); // En utilisant le constructeur BigInt()
const stringBasedBigInt = BigInt("1234567890123456789012345"); // Création à partir d'une chaîne de caractères
console.log(largeNumberLiteral); // Sortie : 9007199254740991n
console.log(largeNumberConstructor); // Sortie : 9007199254740991n
console.log(stringBasedBigInt); // Sortie : 1234567890123456789012345n
Opérations arithmétiques avec BigInt
Les BigInts prennent en charge les opérations arithmétiques standard telles que l'addition, la soustraction, la multiplication, la division et l'exponentiation. Cependant, il y a des considérations importantes à garder à l'esprit :
- L'arithmétique avec des types mixtes n'est pas autorisée : Vous ne pouvez pas effectuer directement des opérations arithmétiques entre des BigInts et des Numbers. Vous devez convertir explicitement les Numbers en BigInts à l'aide du constructeur
BigInt()
avant d'effectuer des calculs. C'est un choix de conception pour éviter une perte de précision involontaire. - Comportement de la division : La division entre les BigInts tronque vers zéro, en ignorant toute partie fractionnaire. Il n'y a pas d'équivalent de l'opérateur modulo (%) qui renvoie un reste fractionnaire.
- Opérateurs de comparaison : Les opérateurs de comparaison standard (
==
,===
,<
,>
,<=
,>=
) fonctionnent entre les BigInts et les Numbers. Notez que==
effectuera une coercition de type, tandis que===
renverra false si vous comparez un BigInt avec un Number.
Exemples d'opérations arithmétiques
const a = 10n;
const b = 5n;
const c = 2;
console.log(a + b); // Sortie : 15n (BigInt + BigInt)
console.log(a - b); // Sortie : 5n (BigInt - BigInt)
console.log(a * b); // Sortie : 50n (BigInt * BigInt)
console.log(a / b); // Sortie : 2n (BigInt / BigInt, troncature vers zéro)
console.log(a ** b); // Sortie : 100000n (Exponentiation de BigInt)
//console.log(a + c); // Ceci lèvera une TypeError : Impossible de mélanger BigInt et d'autres types, utilisez des conversions explicites
console.log(a + BigInt(c)); // Sortie : 12n (BigInt + Number converti en BigInt)
console.log(a > BigInt(c)); // Sortie : true (BigInt comparé à un Number converti en BigInt)
console.log(10n == 10); // Sortie : true
console.log(10n === 10); // Sortie : false
L'opérateur Modulo (%) et les BigInts
L'opérateur modulo (%) ne fonctionne pas directement avec les BigInts. Pour obtenir un résultat similaire, vous pouvez utiliser l'approche suivante :
function bigIntModulo(dividend, divisor) {
return dividend - (divisor * (dividend / divisor));
}
const dividend = 25n;
const divisor = 7n;
console.log(bigIntModulo(dividend, divisor)); // Sortie : 4n
Limites de BigInt
Bien que BigInt offre des avantages significatifs, il est essentiel d'être conscient de ses limites :
- Pas de représentation décimale : Les BigInts ne peuvent représenter que des nombres entiers. Ils ne peuvent pas être utilisés pour l'arithmétique à virgule flottante ou pour représenter des nombres avec des décimales. Pour des calculs décimaux de haute précision, envisagez d'utiliser des bibliothèques comme
decimal.js
oubig.js
. - Mélange avec les Numbers : Comme mentionné précédemment, les opérations arithmétiques directes entre BigInts et Numbers ne sont pas autorisées. Vous devez convertir explicitement les Numbers en BigInts, ce qui peut ajouter de la complexité à votre code.
- Performance : Les opérations BigInt peuvent être plus lentes que les opérations Number standard, en particulier pour les très grands nombres. Cela est dû au fait que l'arithmétique BigInt nécessite des algorithmes et une gestion de la mémoire plus complexes. Considérez les implications sur les performances lorsque vous utilisez BigInt dans des applications critiques en termes de performance.
- Sérialisation JSON : Les valeurs BigInt ne sont pas directement sérialisables avec
JSON.stringify()
. Tenter de sérialiser un BigInt directement entraînera une TypeError. Vous devez convertir le BigInt en chaîne de caractères avant la sérialisation.
Contournement pour la sérialisation JSON
Pour sérialiser les valeurs BigInt en JSON, vous pouvez utiliser la méthode toJSON
ou les convertir explicitement en chaînes de caractères :
const bigIntValue = 12345678901234567890n;
// Méthode 1 : Utilisation de la méthode toJSON
BigInt.prototype.toJSON = function() { return this.toString() };
const obj1 = { value: bigIntValue };
const jsonString1 = JSON.stringify(obj1);
console.log(jsonString1); // Sortie : {"value":"12345678901234567890"}
// Méthode 2 : Conversion explicite en chaîne de caractères
const obj2 = { value: bigIntValue.toString() };
const jsonString2 = JSON.stringify(obj2);
console.log(jsonString2); // Sortie : {"value":"12345678901234567890"}
// Lors de l'analyse (parsing), vous devrez reconvertir en BigInt.
const parsedObj = JSON.parse(jsonString2, (key, value) => {
if (typeof value === 'string' && /^[0-9]+$/.test(value)) {
try {
return BigInt(value);
} catch (e) {
return value; // N'est pas une chaîne BigInt
}
}
return value;
});
console.log(parsedObj.value); //Sortie : 12345678901234567890n
console.log(typeof parsedObj.value); //Sortie : bigint
Cas d'utilisation réels de BigInt
Les BigInts sont précieux dans les scénarios où des calculs précis avec de grands entiers sont critiques. Voici quelques cas d'utilisation importants :
- Cryptographie : Les algorithmes cryptographiques impliquent souvent des calculs avec des nombres premiers extrêmement grands. Les BigInts sont essentiels pour implémenter ces algorithmes avec précision. Les exemples incluent le chiffrement RSA, l'échange de clés Diffie-Hellman et la cryptographie sur les courbes elliptiques. Par exemple, la génération de grands nombres premiers pour RSA implique de vérifier la primalité de très grands nombres, une tâche où BigInt est crucial.
- Applications financières : La gestion de grosses sommes d'argent ou l'exécution de calculs financiers complexes nécessitent une haute précision pour éviter les erreurs d'arrondi. Les BigInts peuvent garantir une représentation précise des valeurs monétaires, en particulier dans les systèmes traitant des devises et des transactions internationales. Imaginez le calcul des intérêts sur une longue période pour un très gros prêt ; BigInt peut maintenir la précision nécessaire.
- Calcul scientifique : Les simulations et calculs scientifiques impliquent souvent le traitement de nombres très grands ou très petits. Les BigInts peuvent être utilisés pour représenter de grandes valeurs entières dans les modèles et simulations scientifiques. Les exemples incluent le calcul de factorielles, la simulation d'interactions de particules et la modélisation de phénomènes astronomiques.
- Technologie Blockchain : Les transactions blockchain et les fonctions de hachage cryptographiques reposent fortement sur l'arithmétique des grands entiers. Les BigInts sont utilisés pour représenter les montants des transactions, les hauteurs de bloc et d'autres éléments de données critiques dans les systèmes blockchain. Pensez à la blockchain Ethereum, où les prix du gaz et les frais de transaction sont souvent exprimés sous forme de très grands entiers.
- Calculs de haute précision : Toute application nécessitant une représentation entière exacte au-delà des limites du type Number peut bénéficier de BigInt. Cela inclut des applications dans des domaines comme la théorie des nombres, les mathématiques combinatoires et le développement de jeux.
BigInt et compatibilité des navigateurs
BigInt est un ajout relativement récent à JavaScript, il est donc essentiel de prendre en compte la compatibilité des navigateurs lors de son utilisation dans vos projets. La plupart des navigateurs modernes prennent en charge BigInt, y compris Chrome, Firefox, Safari et Edge. Cependant, les navigateurs plus anciens peuvent ne pas fournir de support natif. Vous pouvez vérifier la compatibilité à l'aide de ressources comme caniuse.com.
Pour les projets ciblant des navigateurs plus anciens, vous pourriez envisager d'utiliser un polyfill ou un transpileur comme Babel pour fournir le support de BigInt. Un polyfill fournit une implémentation JavaScript de BigInt pour les navigateurs qui ne le supportent pas nativement, tandis qu'un transpileur convertit votre code avec des BigInts en code équivalent qui fonctionne dans des environnements plus anciens.
Meilleures pratiques pour l'utilisation de BigInt
Pour utiliser efficacement les BigInts dans vos projets JavaScript, tenez compte des meilleures pratiques suivantes :
- N'utilisez BigInt que lorsque c'est nécessaire : Évitez d'utiliser BigInt à moins d'avoir spécifiquement besoin de représenter des entiers supérieurs à
Number.MAX_SAFE_INTEGER
ou d'exiger une haute précision. L'utilisation inutile de BigInt peut entraîner une surcharge de performance. - Convertissez explicitement les Numbers en BigInts : Convertissez toujours explicitement les Numbers en BigInts à l'aide du constructeur
BigInt()
avant d'effectuer des opérations arithmétiques. Cela aide à prévenir les erreurs de type accidentelles et garantit que vos calculs sont effectués correctement. - Soyez attentif au comportement de la division : Rappelez-vous que la division entre les BigInts tronque vers zéro. Si vous avez besoin de gérer les restes, utilisez la fonction
bigIntModulo
ou une approche similaire. - Tenez compte des implications sur les performances : Les opérations BigInt peuvent être plus lentes que les opérations Number, en particulier pour les très grands nombres. Testez minutieusement votre code pour identifier les goulots d'étranglement potentiels et optimiser votre utilisation de BigInt.
- Gérez la sérialisation JSON avec soin : N'oubliez pas de convertir les valeurs BigInt en chaînes de caractères avant de les sérialiser en JSON et de les reconvertir en BigInt lors de l'analyse du JSON.
- Utilisez des noms de variables clairs et descriptifs : Lorsque vous travaillez avec des BigInts, utilisez des noms de variables qui indiquent clairement que la valeur est un BigInt. Cela peut aider à améliorer la lisibilité du code et à éviter toute confusion. Par exemple, utilisez des noms comme
largeValueBigInt
ouuserIdBigInt
. - Documentez votre code : Ajoutez des commentaires à votre code pour expliquer pourquoi vous utilisez des BigInts et pour clarifier tout aspect potentiellement déroutant de vos calculs avec BigInt.
Conclusion
Le type de données BigInt de JavaScript offre une solution puissante pour gérer les calculs sur de grands entiers avec précision. En comprenant ses fonctionnalités, ses limites et les meilleures pratiques, vous pouvez exploiter efficacement les BigInts dans un large éventail d'applications, de la cryptographie et la modélisation financière au calcul scientifique et à la technologie blockchain. Bien qu'il y ait des considérations de performance et de compatibilité, les avantages d'une représentation précise des grands entiers l'emportent souvent sur les inconvénients, en particulier dans les situations où la précision est primordiale. N'oubliez jamais de convertir explicitement entre les types Number et BigInt et de gérer soigneusement la sérialisation JSON pour éviter les erreurs inattendues. Alors que JavaScript continue d'évoluer, BigInt jouera sans aucun doute un rôle de plus en plus important pour permettre aux développeurs de relever des défis numériques complexes avec confiance et précision.