Thursday, March 30, 2017
   

Latest Posts

Posted on 7/28/2016 by André Pires in Reflexões
Posted on 1/10/2014 by André Pires in .Net
Posted on 1/7/2014 by André Pires

Posts

Problemas com double?

Posted on 1/10/2014 by André Pires in .Net
image

Olá pessoal! Um aluno meu me informou sobre problemas ao realizar cálculos com números do tipo double. Ele disse que recebe valores imprecisos em diferentes ocasiões e que o número de casas decimais no resultado é bem maior do que o dos números usados, por exemplo, numa simples soma... Nesse post darei algumas dicas sobre isso.

Eis o problema: Ao fazer uma simples atribuição de um valor de ponto flutuante a uma variável, tal como:

double d = 10.10D;

Ao ler d ele recebe algo do tipo 10.100000000000000, ou seja, muitas casas decimais além do esperado por ele...

Eu me lembrava que cálculos feitos entre números de ponto flutuante de precisão dupla no .Net nem sempre (ou nunca) são determinísticos quando o mesmo programa, com a mesma lógica, é executado em computadores diferentes.

Exemplo:

Se você faz essa simples conta:

double d1 = 10.10D;

double d2 = 200.234D;

double d3 = d1 + d2;

Você espera que d3 tenha exatamente o valor 200.334D em todo computador no qual esse cálculo for executado, correto?

Errado!

Tudo vai depender do hardware do computador e até das configurações de ambiente presentes, ou seja, de computador para computador, os resultados poderão sim ser diferente, levando até a resultados com erros grosseiros de precisão.

Basicamente, pelo que li, registradores de 80 bits são usados nos cálculos e depois os resultados são truncados para 64ou 32 bits, o que nos leva a ter diferentes resultados em diferentes computadores...

Resumindo: Floating points são coisa do capeta :) e o link abaixo nos ajuda a entender como eles funcionam:

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Leiam, pois isso é um assunto bastante interessante.

Enfim, a dica que eu dou é que se você estiver fazendo cálculos com números fracionados, principalmente se esses cálculos envolvem dinheiro J, usem o tipo correto para isso, que é o Decimal ou use a classe Math para controlar a precisão e o arredondamento de seus cálculos ;)

Grande abraço!



Home   |   Forum
André Pires 2011