Quiz : Pouvez‑vous compter sur JavaScript ?
Vous maîtrisez la différence entre parseInt et parseFloat ?
Bienvenue dans mon défi sur les nombres JavaScript !
Ce quiz teste vos connaissances des nombres en JS, de parseInt, de parseFloat et de BigInt !
Nous aborderons l’analyse des nombres dans différentes bases, la précision des nombres à virgule flottante et les particularités du système numérique de JavaScript.
Ce ne sont que des nombres : ça ne peut pas être si difficile, si ? 🤓
0.1 + 0.2 === 0.3En raison des erreurs de précision des nombres à virgule flottante, 0.1 + 0.2 n’est pas exactement égal à 0.3. À cause de la façon dont les nombres à virgule flottante sont stockés en mémoire, le résultat est 0.30000000000000004. Le standard IEEE 754 qui gère l’arithmétique en virgule flottante est en cause : il ne peut pas représenter certains nombres exactement. C’est un problème commun à tous les langages de programmation. Au final vous tomberez sur un décimal qui se répète à l’infini, et quel que soit le langage, l’ordinateur doit simplement arrêter de poursuivre des chiffres infiniment répétés.
Certains langages comme Python et Java disposent de Decimal ou BigDecimal pour gérer cela, mais ce n’est pas intégré à JavaScript. Vous pouvez utiliser des bibliothèques comme big.js ou decimal.js pour ces cas.
(Note : Certains langages sont conçus pour gérer les fractions, les nombres imaginaires, etc., à un niveau logique supérieur, en préservant les expressions littérales. Mais ils doivent tout de même faire face aux mêmes problèmes de précision des nombres à virgule flottante au niveau matériel.)
Que pourrait‑il faire ?
5..toFixed(2).toFixed(2) renvoie une représentation sous forme de chaîne de 5 avec deux décimales, donc le résultat est "5.00".
Le double point (5..toFixed(2)) est une « astuce » pour accéder au modèle d’objet des littéraux numériques.
Quel sera le résultat ?
parseInt("0x2A") === parseInt("2a", 16)Toute chaîne d’entrée qui commence par 0x est automatiquement traitée comme une valeur hexadécimale (radix 16).
Elle est donc équivalente à passer un radix de 16. Ainsi, parseInt("0x2A") est identique à parseInt("2a", 16). (C’est insensible à la casse.)
[24, 'One', 42].map(parseInt)Le deuxième argument de parseInt (la base) correspond à l’argument index des méthodes de tableau. Cela entraîne des résultats inattendus, car parseInt("One", 1) renvoie NaN à cause de l’entrée invalide.
Le premier élément, 24, est analysé comme 24 en base 0 (détection automatique), il reste donc 24. Le deuxième élément, 'One', est analysé comme NaN en base 1. Le troisième élément, 42, est analysé en base 2. En base 2, '42' donne NaN, donc le résultat est [24, NaN, NaN].
C’est un piège fréquent avec parseInt et map. Si vous voulez convertir un tableau de chaînes en nombres, la seule méthode « intégrée » sûre est .map(Number) ou en ajoutant une fonction de rappel .map(x => parseInt(x, 10)).
Tableau comparatif
| Fonction | parseInt | parseFloat | Number | BigInt |
|---|---|---|---|---|
| Ignore les espaces | ✅ | ✅ | ✅ | ✅ |
.map(FN) | ❌ | ☑️ | ✅ | ✅ |
| Accepte un argument de base | ✅ | ❌ | ❌ | ❌ |
| Préfixes binaires, octaux et hexadécimaux dans les chaînes | Seulement 0x ; 0b/0o ne sont pas reconnus automatiquement | ❌ | ✅ | ✅ |
Caractères invalides 42 oh no | 42 | 42 | NaN | SyntaxError |
Comment vous en êtes‑vous sorti ? 🧐
Vous cherchez une pause après tant de binaire ?
Pftt, rappelez‑vous : faites une pause après les compétences !
Allez sur ma salle pour en décimer d’autres ! 💪
