Como é que 0,1 + 0,2 == 0,3 é falso no JS?
JavaScript's tipo de número usa números binários de ponto flutuante. Os números de ponto flutuante são um bom sistema de propósito geral, capaz de representar uma gama enorme de números com uma precisão razoavelmente boa, mas finita.
Nos bastidores, um número de ponto flutuante é um inteiro multiplicado por algum expoente da base (mais um sinal, etc. e detalhes técnicos que implementam zero, infinito, NaN, etc.)
Ainda, o importante é que ele's é uma representação binária. Em binário, 0.1, 0.2, e 0.3 cada um tem representações infinitas, assim como 1/3 tem a representação infinita 0.333... em decimal, mas poderia ser uniformemente "0.4" na base 12. Em algum momento, você precisa cortar uma representação infinita, trocando a precisão pela capacidade de representá-la em um espaço finito.
Acontece que sob aritmética de ponto flutuante o erro cumulativo de cortar as extremidades dessas representações infinitas produz um leve erro em 0.1 + 0.2 == 0.3.
O computador está correcto ao dizer they're not equal, apenas a expressão que avaliou deve ser implicitamente lida como "fpa(0.1) + fpa(0.2) == fpa(0.3)", onde a função "fpa" produz a aproximação da vírgula flutuante de um número. Essa expressão é mais obviamente falsa!
Para a maioria das computações casuais ou Web isto é't normalmente um grande negócio. Se for importante, é trivial criar uma função usando logaritmos para verificar se dois números são "suficientemente próximos" para serem considerados iguais para um determinado nível de precisão.
Outras linguagens de programação geralmente têm múltiplos tipos de números, e cabe ao programador escolher a representação mais adequada para o trabalho.