Come mai 0.1 + 0.2 == 0.3 è falso in JS?
JavaScript's utilizza numeri binari in virgola mobile. I numeri in virgola mobile sono un buon sistema generico, in grado di rappresentare una vasta gamma di numeri con una precisione ragionevolmente buona ma finita.
Dietro le quinte, un numero in virgola mobile è un intero moltiplicato per qualche esponente della base (più un segno, ecc. e dettagli tecnici che implementano zero, infinito, NaN, ecc.)
Comunque, l'importante è che sia una rappresentazione binaria. In binario, 0.1, 0.2, e 0.3 hanno ciascuno rappresentazioni infinite, proprio come 1/3 ha la rappresentazione infinita 0.333... in decimale, ma potrebbe essere anche "0.4" in base 12. Ad un certo punto, è necessario tagliare una rappresentazione infinita, scambiando la precisione per la capacità di rappresentarla in uno spazio finito.
Si dà il caso che in aritmetica a virgola mobile l'errore cumulativo di tagliare le estremità di queste rappresentazioni infinite produce un leggero errore in 0.1 + 0,2 == 0,3.
Il computer è corretto nel dire che non sono uguali, solo che l'espressione che hai valutato dovrebbe essere implicitamente letta come "fpa(0,1) + fpa(0,2) == fpa(0,3)", dove la funzione "fpa" produce l'approssimazione in virgola mobile di un numero. Questa espressione è più ovviamente falsa!
Per la maggior parte dei calcoli casuali o per il web questo non è di solito un grosso problema. Se è importante, è banale creare una funzione che usi i logaritmi per controllare se due numeri sono "abbastanza vicini" da essere considerati uguali per un dato livello di precisione.
Altri linguaggi di programmazione hanno solitamente più tipi di numeri, e sta al programmatore scegliere la rappresentazione più adatta al lavoro.