Em JavaScript, porque faz 0.1 + 0.2 ! ! == 0.3?
Em decimal, é fácil armazenar o número 0,3 de forma limpa. Requer apenas uma casa após o ponto decimal. Mas o computador não armazena números em ponto flutuante em decimal - ele os armazena em binário.
Em decimal, cada casa à direita do ponto decimal vale um décimo tanto quanto a casa à esquerda dele. Portanto, tem um décimo, depois um centésimo, um milésimo e assim por diante. Três décimos - que é 0,3 - guarda limpa e bem na décima casa.
Em binário, no entanto, cada casa à direita da casa decimal vale metade do que a casa à esquerda da mesma. Então o binário tem uma metade - um quarto - lugar, um oitavo - lugar, um décimo sexto - lugar, um trinta segundos, um sessenta e quatro lugares, etc.
O formato de ponto flutuante binário vai ter que armazenar o valor como um quarto, mais um trigésimo segundo, e um sessenta e quatro, e assim por diante, aproximando-se cada vez mais de 0.3 - mas nunca atingindo-o exactamente.
Então ele armazena a aproximação mais próxima de 0.3 que pode no número de bits que a variável tem disponível, e essa aproximação é o que você está vendo ao inspecionar o valor no seu programa.
Se você realmente precisa ser capaz de armazenar números decimais precisamente em um programa - por exemplo, aplicações financeiras - há algumas opções disponíveis:
Se você souber a precisão máxima que você vai precisar, você poderia considerar o uso de ponto fixo. Em ponto fixo, você usa um tipo inteiro para armazenar o valor, mas trata o valor do incremento como algo menor que 1. Por exemplo, você poderia armazenar um preço como um número inteiro em centavos, ou décimos/centésimos de um centavo.
Você também poderia usar um formato chamado "binary coded decimal". Ele usa quatro bits para armazenar cada dígito decimal - o que é um pouco ineficiente, pois 16 valores podem ser armazenados em 4 bits, mas a DCB só faz uso de 10 desses valores possíveis para armazenar 0-9.
Se a representação precisa dos números decimais é o que é realmente importante para a sua aplicação, no entanto, ainda pode valer a pena usar, apesar da ineficiência.