Quiz: Können Sie auf JavaScript zählen?
Kennst du den Unterschied zwischen parseInt und parseFloat?
Willkommen bei meiner JavaScript-Zahlen-Challenge!
Teste dein Wissen über Zahlen in JS, parseInt, parseFloat und BigInt. Es geht um das Parsen in verschiedenen Zahlensystemen, Gleitkommapräzision und die Eigenheiten des JavaScript-Zahlensystems.
Es sind doch nur Zahlen. Wie schwer kann das sein? 🤓
0.1 + 0.2 === 0.3Wegen Präzisionsfehlern bei Gleitkommazahlen ist 0.1 + 0.2 nicht exakt gleich 0.3. Durch die Art, wie Gleitkommazahlen im Speicher abgelegt werden, ergibt sich 0.30000000000000004. Der IEEE‑754‑Standard für die Behandlung von Gleitkommaarithmetik ist schuld, er kann manche Zahlen nicht exakt darstellen. Das ist ein verbreitetes Problem in allen Programmiersprachen. Irgendwann stößt man auf eine unendlich wiederholende Dezimalzahl, und egal welche Sprache man nutzt – der Computer muss einfach aufhören, unendlich viele Stellen zu verfolgen.
Einige Sprachen wie Python und Java bieten Decimal oder BigDecimal, um das zu lösen, aber JavaScript hat das nicht eingebaut. Man kann Bibliotheken wie big.js oder decimal.js verwenden, um solche Fälle zu behandeln.
(Hinweis: Manche Sprachen sind darauf ausgelegt, Brüche, imaginäre Zahlen usw. auf einer höheren logischen Ebene zu handhaben und literale Ausdrücke zu bewahren. Trotzdem müssen sie auf der Hardware‑Ebene dieselben Präzisionsprobleme mit Gleitkommazahlen bewältigen.)
Was könnte das tun?
5..toFixed(2).toFixed(2) gibt eine String‑Darstellung von 5 mit zwei Dezimalstellen zurück, also ist das Ergebnis "5.00".
Der doppelte Punkt (5..toFixed(2)) ist ein ‘Trick’, um auf das Objektmodell von Zahlen‑Literalien zuzugreifen.
Was ergibt das?
parseInt("0x2A") === parseInt("2a", 16)Jeder Eingabestring, der mit 0x beginnt, wird automatisch als Hexadezimal (Radix 16) behandelt.
Er ist daher äquivalent dazu, einen Radix von 16 zu übergeben. Also ist parseInt("0x2A") dasselbe wie parseInt("2a", 16). (Groß‑ und Kleinschreibung ist egal.)
[24, 'One', 42].map(parseInt)Das zweite Argument von parseInt (die Basis) stimmt mit dem index‑Argument der Array‑Methoden überein. Das führt zu unerwarteten Ergebnissen, da parseInt("One", 1) wegen der ungültigen Eingabe NaN zurückgibt.
Das erste Element, 24, wird in Basis 0 (automatische Erkennung) als 24 geparst, also bleibt es 24. Das zweite Element, 'One', wird in Basis 1 zu NaN geparst. Das dritte Element, 42, wird mit Basis 2 geparst. In Basis 2 ist '42' kein gültiger Wert, also ergibt das Ergebnis [24, NaN, NaN].
Das ist ein häufiger Stolperstein bei parseInt und map. Verwende .map(Number), um jeweils den gesamten String in eine Zahl umzuwandeln, oder .map(x => parseInt(x, 10)), um ein ganzzahliges Präfix zur Basis 10 einzulesen. Beide Varianten haben unterschiedliche Parsing-Regeln; wähle die beabsichtigte Bedeutung.
Vergleichstabelle
| Function | parseInt | parseFloat | Number | BigInt |
|---|---|---|---|---|
| Ignoriert Whitespace | ✅ | ✅ | ✅ | ✅ |
.map(FN) | ❌ | ☑️ | ✅ | ✅ |
| Unterstützt Radix‑Argument | ✅ | ❌ | ❌ | ❌ |
| Binär-/Oktal-/Hex-Präfixe in Strings | Nur hexadezimales 0x; 0b/0o werden nicht automatisch erkannt | ❌ | ✅ | ✅ |
Ungültige Zeichen 42 oh no | 42 | 42 | NaN | SyntaxError |
Wie hast du abgeschnitten? 🧐
Brauchst du nach all dem Binärcode eine Pause?
Pftt, denk dran: Pause nach den Skills!
Geh zu my gym und knack noch ein paar Challenges! 💪
