2
respostas

Porque apareceu um 4 na resposta?

Quando eu executei o código: using System;

namespace Testes_Alura { class Program { static void Main(string[] args) { double valor1 = 0.2; double valor2 = 0.1; double total = valor1 + valor2; Console.WriteLine(total);

    }
}

}

A reposta que me veio foi: 0,30000000000000004 Porque dessa resposta?

2 respostas

De forma resumida: os números são guardados em binário na memória. Para os valores não-inteiros, eles são guardados usando potências negativas de 2 (2^-1 = 0,5; ou 2^-2 = 0,25; ou 2^-3 = 0,125, e assim em diante para cada bit).

Por causa disso, não há representação exata para todos os números, e há uma leve perda de precisão. Se você sempre usar potências negativas de 2, por exemplo, essa perda de precisão não deve ocorrer.

Como lidar com isso: Provavelmente, nesse momento seja mais fácil nem se preocupar muito com isso. Quanto alguns exemplos em que se precisa ter cuidado, temos abaixo:

  • Para imprimir o valor na tela, formatar ele para o número de casas decimais desejadas (no meu projeto, eu precisei propositalmente aumentar o número de casas decimais a serem impressos para reproduzir o problema. Por algum motivo, o padrão era um número de casas decimais menor que no seu projeto — o que demonstra que especificar o número de casas decimais pode ser uma boa ideia de qualquer modo).
  • Para testar igualdade, se incluir uma margem de erro (por exemplo, subtrair o valor A de B, e verificar se o resultado está entre a margem de erro, como -0,001 e 0,001).
  • Essa não é uma lista extensiva: pode ser que hajam outros casos que cuidados com esses números sejam importantes. Um exemplo que já ouvi falar é de sistemas que lidam com dinheiro, e que, ao invés de usar Double/Float, usam inteiro mas representando o número de centavos (ou seja, se o valor é de R$ 10,95, internamente o valor é 1095, e apenas na hora de apresentar ao cliente que o valor é formatado).

Leitura Extra:

Bom dia Felipe,

Isso acontece na maior parte das linguagens e é um problema relacionado com a precisão dos float's, que no final de contas são armazenados em forma binária, e existem alguns números que não conseguem ser armazenados perfeitamente de forma binária com o float.

Se quiser entender um pouco mais, encontrei uma explicação bem boa na documentação do python que pode ajudar. Pode acessar ela aqui

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software