Pessoal,
Parece meio estranho, mas estou com problema na seguinte multiplicação:
Float teste = Float.valueOf(34.19f);
teste = teste * Float.valueOf(100);
System.out.println(teste);
me retorna o seguinte valor 3418.9998. Tento outras multiplicações e funciona ok, só que quando envolve um valor fracionário com final .19 acontece o problema.
Alguém já passou por isso ?
Desde já agradeço à atenção de todos.
use BigDecimal.
float vai ter estes problemas mesmo.
O float é muito ridículo…
Acredite pois já passei por isso…
Se é para estudos use o double que tem mais precisão.
Mas se é para algum software use BigDecimal mesmo…
Isso também ocorre com double. Este é um erro conhecido.
O float e o double não são ridículos, são formas de armazenamento muito eficientes
quando se pretende guardar valores com dizimas sem limitação.
Só que são sistemas que usam potências para armazenar essas dizimas e claro, não
é sempre possível encontrar uma potência que produza exatamente aquele valor
esperado. Lembrando que uma potência negativa divide o número base por um
expoente produzindo a parte decimal.
Então o float não foi criado para armazenamentos mundanos, financeiros, com limitação
de casas decimais, foi criado para armazenar valores científicos até a última casa com
a melhor precisão possível.
E para esses valores truncados, menores, arredondados, são criadas então variações
não primitivas que os compreendam melhor.
Está aí a explicação então!!
Se você for cientista usa float…
Se você é um reles mortal que só precisa de coisas mundanas use BigDecimal…
Obrigado pela luz JoaoBluSCBR
Pessoal
Valeu pelas dicas, vou usar o BigDecimal mesmo ele funcionou tranqüilo no teste que fiz abaixo:
Float teste = Float.valueOf(0.19f);
Double teste01 = new Double(0.19);
BigDecimal teste02 = new BigDecimal(0.19);
teste02 = teste02.setScale(2, BigDecimal.ROUND_DOWN);
for (int i = 0; i < 50; i++) {
System.out.println("Index ->" + i + " Valor " + teste02 + " Float ->" + teste * Float.valueOf(100) + " Double -> " + teste01 * 100 + " BigDecimal " + teste02.multiply(BigDecimal.valueOf(100)));
teste = teste + Float.valueOf(1);
teste01 = teste01 + Double.valueOf(1);
teste02 = teste02.add(BigDecimal.valueOf(1));
}
Valeu mesmo pelas dicas.
Então pode encerrar o Tópico!
[quote=fernandosavio]Está aí a explicação então!!
Se você for cientista usa float…
Se você é um reles mortal que só precisa de coisas mundanas use BigDecimal…
Obrigado pela luz JoaoBluSCBR[/quote]
Bem, espero não ter ofendido ninguém.
Só estava tentando mostrar que existe um motivo para float e double agirem assim.
Já ouvi outras pessoas criticarem esses primitivos como se fosse um erro o fato deles
não produzirem certos valores de forma exata.
Então não é um erro, mas um resultado incorreto previsto pela forma de cálculo que
ele utiliza.
Seria a mesma coisa que dizer que o processo de compactacao jpg é errado por que
opta por perder bits da imagem para ganhar em reducao.
A intenção também não foi ofender.
É que todos que começam a aprender java são instruídos a aprender float ou double como pontos flutuantes ao invés de um tipo mais voltado para o tipo de exercício que dão na faculdade.
Acho que todos já passaram por essa frustração.
Mas achei interessante a explicação! Eu nem imaginava que era assim que funcionava (pobre do float sendo ofendido pela minha ignorância! eheh)…
Tem algum link com alguma explicação mais aprofundada do assunto?