9.96*50.0 = 498.00000000000006 O que é isso?

6 respostas
m0ska

Senhores, tenho dois números Double, o primeiro é 9.96 e o segundo é 50.0
Gostaria de saber por que a multiplicação destes resulta em 498.00000000000006
Quando matematicamente deveria resultar em 498.0
Desde já agradeço…
Este lance está quebrando meu sistema de almoxarifado hahahaha

6 Respostas

mgarcia

fala m0ska…

para valores financeiros, recomenda-se a utilização de BigDecimal

luisgarcia173

Brother, achei uma parada que resolve seu problema, não sei qual é a complexidade de alterar sua aplicação:

public static double truncate(double value) { return Math.round(value * 100) / 100d; }

O método trunca os valores até segunda casa decimal e arredonda se > 5 e etc…

Mas assim, dê uma olhada nesse post que pode te ajudar mais:
http://www.guj.com.br/posts/list/48264.java

Abraço.

m0ska

Caras, eu utilizei Math.floor() e number format para deixar padronizado na apresentação.
Mas a minha pergunta é: de onde saiu esse 6 no final do número, pq matematicamente isto é impossível.
Será que java tem algum problema para calcular com números de ponto flutuante? pq o resultado matemático para este calculo é? 498.0

B

m0ska:
Caras, eu utilizei Math.floor() e number format para deixar padronizado na apresentação.
Mas a minha pergunta é: de onde saiu esse 6 no final do número, pq matematicamente isto é impossível.
Será que java tem algum problema para calcular com números de ponto flutuante? pq o resultado matemático para este calculo é? 498.0

Computadores não tem precisão infinita para representar ou calcular todos os números possíveis, ainda mais os tipos de número de ponto flutuante do Java, que foram feitos para velocidade de cálculo, e não corretude.

allanmarques

Vc pode dar uma olhada aqui, explica o que está acontecendo com você:
http://www.jspbrasil.com.br/mostrar/47

E aqui também:
http://docs.sun.com/source/806-3568/ncg_goldberg.html

m0ska

Valeu Allan, os artigos me ajudaram a entender isto.
O que eu não sabia é que calculos simples resultariam em uma inexatidam, mas eu vou passar a utilizar valores em bigDecimal quando precisar de precisao.

Muito obrigado a todos!

Criado 14 de maio de 2009
Ultima resposta 14 de mai. de 2009
Respostas 6
Participantes 5