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

7 respostas
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

7 Respostas

Vinicius_Zibetti_Res

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.

x111

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

maior_abandonado
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

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?

cristianonasciment

use BigDecimal e seja feliz !!!

L

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.

eliangela

Gente, valeu pela ajuda!

Não sabia que processador tinha dessas frescuras, rsrs

Troquei aqui por BigDecimal.

Obrigada

WellingtonRamos

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.

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.

Criado 10 de abril de 2012
Ultima resposta 10 de abr. de 2012
Respostas 7
Participantes 7