[RESOLVIDO] Problema multiplicação de um Float por 100

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?