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.
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…
S
soaresinfo
Isso também ocorre com double. Este é um erro conhecido.
J
JoaoBluSCBR
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.
F
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
U
ulissesnairne
Pessoal
Valeu pelas dicas, vou usar o BigDecimal mesmo ele funcionou tranqüilo no teste que fiz abaixo:
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
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.
F
fernandosavio
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?