Por que 0,1+0,2 não é igual a 0,3 na maioria das linguagens de programação?
na maioria dos computadores é verdadeiro se você usar == como comparação
para entender porque você precisa entender como números de ponto flutuante são armazenados em um computador.
o principal problema sobre porque neste caso em particular é porque 0.1 e 0.3 não estão dentro do mesmo expoente base dentro de um float.
, então por causa de tal 0.3 tem menos acuracidade que 0.1 e 0.2, e quando você adiciona 0.1 e 0.2 há alguma truncagem .
primeiro.
0.1 em um computador não é realmente 0.1 é realmente 0.100000001490116119384765625
(é o mais próximo do computador que pode obter mas não é exactamente 0.1)
0.2 num computador não é realmente 0.2 é ao invés disso 0.2.20000000298023223876953125
- 0.100000001490116119384765625
- +0.20000000298023223876953125
- -------------------------------
- 0.30000000447034835815429687
- but a computer cannot store this number either so it stores
- 0.2999999821186065673828125
- (and yes because 0.1 and 0.2 are in different bases it does lost a few values)
now 0.3 is also not 0.3 but: 0,300000011920928955078125
e claramente 0,300000011920928955078125 não é igual a 0,299999999821186065673828125
está muito próximo mas não é igual a 0,299999999821186065673828125
está muito próximo mas não é igual a 0,2999999998211860653828125
> está muito próximo mas não é igual a 0,29999999999811860653828125adicionando pontos flutuantes a menos que casos específicos (na maioria dos casos potências de 2 ou números que podem ser divididos por dois após menos de 24 vezes), não podem ser representados como pontos flutuantes exactamente e darão sempre erros.
e ao fazer isto um computador você precisa saber qual é a sua margem de erro
(em floats é mais ou menos o mesmo número dividido por um 10^6) para estar sempre seguro e é relativo ao número que você está olhando.
em outras palavras, se você adicionar 1 + 10^6 o erro será terrível de fato tanto que adicionar 1 a 10 ^8 lhe dará 10^8 sem nenhuma mudança.