Quiz: Puoi contare su JavaScript?
Sai distinguere parseInt da parseFloat?
Benvenuto alla sfida sui numeri in JavaScript!
Questo quiz mette alla prova le tue conoscenze su numeri, parseInt, parseFloat e BigInt: conversioni in basi diverse, precisione in virgola mobile e stranezze del sistema numerico di JavaScript.
Sono solo numeri: quanto potrà essere difficile? 🤓
0.1 + 0.2 === 0.3A causa degli errori di precisione dei numeri in virgola mobile, 0.1 + 0.2 non è esattamente uguale a 0.3. A causa del modo in cui i numeri in virgola mobile sono memorizzati in memoria, il risultato è 0.30000000000000004. Lo standard IEEE 754 per la gestione dell’aritmetica in virgola mobile è il colpevole: non può rappresentare alcuni numeri esattamente. Questo è un problema comune in tutti i linguaggi di programmazione. Prima o poi ti imbatterai in un decimale infinitamente ripetuto, e indipendentemente dal linguaggio, il computer deve semplicemente smettere di inseguire cifre infinitamente ripetute.
Alcuni linguaggi come Python e Java hanno Decimal o BigDecimal per gestire questo problema, ma non è integrato in JavaScript. Puoi usare librerie come big.js o decimal.js per gestire questi casi.
(Nota: Alcuni linguaggi sono progettati per gestire frazioni, numeri immaginari, ecc. a un livello logico superiore, preservando le espressioni letterali. Ma devono comunque affrontare gli stessi problemi di precisione in virgola mobile a livello hardware.)
Cosa potrebbe fare?
5..toFixed(2).toFixed(2) restituisce una rappresentazione in stringa di 5 con due decimali, quindi il risultato è "5.00".
Il doppio punto (5..toFixed(2)) è un ‘trucco’ per accedere al modello a oggetti dei letterali numerici.
Quale sarà il risultato?
parseInt("0x2A") === parseInt("2a", 16)Qualsiasi stringa di input che inizia con 0x viene automaticamente trattata come esadecimale (radice 16).
È quindi equivalente a passare una radice di 16. Quindi, parseInt("0x2A") è uguale a parseInt("2a", 16). (Non fa distinzione tra maiuscole e minuscole.)
[24, 'One', 42].map(parseInt)Il secondo argomento di parseInt (il radix) si allinea con l’argomento index dei metodi degli array. Questo porta a risultati inaspettati, poiché parseInt("One", 1) restituisce NaN a causa dell’input non valido.
Il primo elemento, 24, viene interpretato come 24 in base 0 (rilevamento automatico), quindi rimane 24. Il secondo elemento, 'One', viene interpretato come NaN in base 1. Il terzo elemento, 42, viene interpretato usando la base 2. In base 2, '42' è NaN, quindi il risultato è [24, NaN, NaN].
È un’insidia comune di parseInt e map. Usa .map(Number) per convertire l’intera stringa in un numero, oppure .map(x => parseInt(x, 10)) per analizzarne il prefisso intero in base 10. Le due operazioni hanno regole diverse: scegli quella adatta al risultato desiderato.
Tabella di confronto
| Funzione | parseInt | parseFloat | Number | BigInt |
|---|---|---|---|---|
| Ignora spazi bianchi | ✅ | ✅ | ✅ | ✅ |
.map(FN) | ❌ | ☑️ | ✅ | ✅ |
| Supporta argomento radix | ✅ | ❌ | ❌ | ❌ |
| Prefissi binari/ottali/esadecimali nelle stringhe | Solo esadecimale 0x; 0b/0o non vengono dedotti | ❌ | ✅ | ✅ |
Caratteri non validi 42 oh no | 42 | 42 | NaN | SyntaxError |
Come te la sei cavata? 🧐
Cerchi una pausa dopo così tanto binario?
Pftt, ricorda: pausa dopo le competenze!
Vai nella mia palestra per affrontare altre sfide! 💪
