Erro de precisão float e double

4 respostas
V

Olá
Estou com um problema no meu sistema.
Bom, o problema é o seguinte:
O programa é para uma empresa de materias de construção, a qual solicitou a mudança do sistema para aceitar três casas decimais nos preços dos produtos, mas agora, está ocorrendo um problema:
O método que calcula o valor da venda, é feito com variáveis do tipo double, e o resultado (valorTotal) é um double, mas é retorno deste método é um float. Ou seja, é necessário fazer um casting de double para float, e ai que está o problema, quando este casting é feito, os valores decimáis vem errados.
Ex: a soma dos produtos é 519,860 mas quando o casting é feito retorna 519,844 ou 519,875.

public float getValorTotalItens(){

double valorTotal = 0;

for(int indice=0;indice<=itens.size()-1;indice++){

ItensVendaAndamento itemAtual = (ItensVendaAndamento) itens.get(indice);

valorTotal += Utilitarios.getAproximacao(itemAtual.getPrecoUnitário()*itemAtual.getQuantidade());

}

float valor = Utilitarios.alteraSeparadorDecimal(String.valueOf(valorTotal));

//O alteraSeparadorDeciamal elimina os pontos e substitui a virgula por . ex 1.500,50 fica 1500.50, seu retorno é um float

return valor;

}

Qual seria a solução para esse problema, sendo que substituir o retorno do método para String ou Double é inviável.

4 Respostas

T

Não tem solução, já que a precisão de um float é de apenas 5 casas decimais e você está querendo que ele tenha precisão de 6 casas. Sinto muito.

O correto é alterar o retorno para double.

Amigo - por que é que alguém usaria “float” para fazer contas? Isso não se deve fazer em hipótese nenhuma, devido à precisão insuficiente. Refaça o sistema, vai dar trabalho e um monte de testes terão de ser refeitos, mas que isso fique como lição - para mexer com dinheiro, use BigDecimal ou double.

Nunca use “float”.

T

É claro que em computação gráfica se usa muito “float”, mas isso é porque você não enxerga os centésimos de centavo, aham, os erros de precisão. Mesmo assim muitas vezes, para evitar alguns “artefatos” (por exemplo, polígonos que não se juntam perfeitamente, dando a impressão que uma figura está com um “vazamento”), em alguns casos usa-se “double”.

recoma

Não se usa float ou double quando se está tratando de valores financeiros…

Vc deve usar o http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html

que te garante precisão…

maquiavelbona

Se você se importa com precisão, use BigDecimal para cálculos, pois double e float respeitam (na maioria dos casos) a IEEE-754, que não adequa uma precisão infinita em um número finito de bytes.
Podes ver aqui uma explicação dos problemas de precisão.

Até!

Criado 25 de junho de 2007
Ultima resposta 25 de jun. de 2007
Respostas 4
Participantes 4