[RESOLVIDO] Java / Android está somando 21.7 + 2.9 = 24.59999999999999998

Olá, pessoal!

Estou fazendo uma aplicação Android que busca uma lista de produtos que estão no “carrinho de compras” e soma o valor total dos itens. O problema é que a soma final está dando errada, assim: 21.7 + 2.9 = 24.59999999999999998

É muito estranho, porque eu percorro a lista de item em item, e os itens são somados corretamente mas, quando chega num item específico, ele soma errado.
Eu já debuguei o código e o valor do item está correto (2.9).

As variáveis valorItem e valorTotal são double.

Segue meu código:

[code]public void addProduto(ItemVenda itemVenda) {
itens.add(itemVenda);
valorTotal += itemVenda.getValorTotalItem();
}[code]

Eu não quero resolver isso com uma POG, arredondando os valores, quero saber o que pode estar errado no meu código.

Obrigada

public final EPS = 1e-14;

Tenta colocar no final dessa soma o epsilon, tpw:
(15.9D+14.1D) + EPS;

Ou então faça uma adaptação, como:
BigDecimal.valueOf(21.7).add(BigDecimal.valueOf(2.9)).doubleValue();

Java trabalha com complemento 2, deve estar havendo algum problema no Java mesmo.

Muito provavelmente o problema não está em sua lógica e sim na “precissão” dos tipos flutuantes. Para maiores duvidas de uma olhada aqui:
http://www.guj.com.br/java/68086-multiplicar-doubles#357907

[quote=eliangela]Olá, pessoal!

Estou fazendo uma aplicação Android que busca uma lista de produtos que estão no “carrinho de compras” e soma o valor total dos itens. O problema é que a soma final está dando errada, assim: 21.7 + 2.9 = 24.59999999999999998

É muito estranho, porque eu percorro a lista de item em item, e os itens são somados corretamente mas, quando chega num item específico, ele soma errado.
Eu já debuguei o código e o valor do item está correto (2.9).

As variáveis valorItem e valorTotal são double.

Segue meu código:

[code]public void addProduto(ItemVenda itemVenda) {
itens.add(itemVenda);
valorTotal += itemVenda.getValorTotalItem();
}[code]

Eu não quero resolver isso com uma POG, arredondando os valores, quero saber o que pode estar errado no meu código.

Obrigada[/quote]

em java temos esse problema por usarmos floats ou double com números quebrados (assim como em qualquer outra linguagem que segue um padrão la que não lembro o nome.) mas resolvemos isso usando BigDecimal para fazer os calculos… na api do android não teria um BigDecimal para você usar?

use BigDecimal e seja feliz !!!

Jamais use double ou float para cálculos financeiros. Sempre use BigDecimal.

Isso é em qualquer linguagem. Floats e doubles são para cálculos matemáticos, decimal para financeiro.

Gente, valeu pela ajuda!

Não sabia que processador tinha dessas frescuras, rsrs

Troquei aqui por BigDecimal.

Obrigada

[quote=Longino]Jamais use double ou float para cálculos financeiros. Sempre use BigDecimal.

Isso é em qualquer linguagem. Floats e doubles são para cálculos matemáticos, decimal para financeiro.[/quote]E mesmo assim, para esses itens, deve-se ter em mente que há imprecisão matemática e a mesma deverá permanecer constantemente sob intenso controle.