2
respostas

Diferença no cálculo do redimento anual gera um erro de arredondamento

Olá,

Tentei escrever o método somando o rendimento anual mês a mês e os resultados foram diferentes. Procurei uma forma de visualizar o cálculo mensal e cheguei no código abaixo:

public double CalculaRendimentoAnual()
        {
            double saldoMesAtual = this.saldo;
            double saldoNaqueleMes = this.saldo;
            double rendimentoAnual = 0;
            for(int i = 1; i <= 12; i++)
            {
                rendimentoAnual += saldoMesAtual * 0.007;
                saldoMesAtual += rendimentoAnual;
                saldoNaqueleMes = saldoNaqueleMes * 1.007;
                Console.Out.WriteLine(saldoNaqueleMes - this.saldo);
                Console.Out.WriteLine(rendimentoAnual);

            }
            double rendimento = saldoNaqueleMes - this.saldo;
            return rendimentoAnual;
        }

Alguém saberia me informar porque o C# arredonda os valores diferentemente para cada método? Seguem os resultados para os 3 primeiros meses:

16,0999999999999 16,1 32,3126999999995 32,3127 48,6388888999991 48,7515889

Obrigado pela ajuda,

Gustavo Fonseca

2 respostas

Olá, Gustavo

A não ser que você tenha um ótimo motivo para isso, nunca utilize double para armazenar e operar valores monetários em .NET. Utilize sempre decimal.

O tipo de dados decimal evita a perda de precisão durante os cálculos decimais, o que é fundamental para cálculos financeiros, por exemplo. Utilize o tipo de dados double quando houver alguma tolerância à perda de precisão decimal, como por exemplo em cálculo de dados científicos.

Outra coisa: extraia as constantes (No visual studio: CTRL + PONTO, "Introduce local constant") do seu código e armazene-as como decimal, utilizando a letra "M" ao final do número: 0.007M e 1.007M.

Olá,

Obrigado pelas informações. Eu entendo os pontos passados porém pelo que o curso explica estas informações estão além do escopo do mesmo. Vou colocá-las no meu código porém devido as diferenças no cálculo eu achei que era uma pergunta interessante para se fazer. Lembrando que o curso introdutório de C# não fala de decimais nem mesmo constantes.