Pessoal,
Estou construindo uma aplicação financeira em que preciso de resultados exatos, ou seja, não posso ter diferença de centavos.
Contruí a aplicação usando double e, é claro que, o resultado apresentou muitos problemas de centavos.
Achei que utilizar a classe BigDecimal é muito ruim, talvez um pouco complexo, então pensei em armazenar os valores como inteiro (long) e na hora de exibir esses valores eu converteria para decimal, ou seja, dividiria o valor por 100 e editaria com 2 casas decimais.
Comecei a pesquisar e descobri varias opiniões para resolver o problema, mas cada um fala uma coisa diferente do outro. Uns falam que o long também não dá resultados exetos, outros falam que em algumas situações o BigDecimal também não dá resultados exatos.
Gostaria de saber se os resultados de calculos com long são exatos e qual é o melhor caminho a tomar para ter resultados exatos?
A minha preferencia seria usar o long e fazer os cáculos de soma, subtração, divisão e multiplicação antes de editar como valor financeiro. O que vocês acham?
Grato,
bom, na minha opinião eu axo melhor o BigDecimal que ele dá valores mais precisos, e no caso financeiro é isso que necessita…
- tb tem o DecimalFormat, que tb é muito bom, basta dá uma olhadinha pra saber como usar corretamente…
eu faria com BigDecimal é muito rica sua documentação…
vlw
Eu tb faria com BigDecimal.
Verifique com qtas casas decimais vc pretende trabalhar e vá fazendo arredondamento pra esse tanto de casas (um truncando) a cada cálculo.
Detalhe: Crie o seu método de arredondamento pq já encontramos bugs no setScale do BigDecimal, então fizemos o nosso método de arredondamento e pronto, tudo ok!
Tanto long quanto BigDecimal te dá resultados exatos. No caso do long, as falhas aparecerão quando ocorrer overflow, um número acima de 2^63 -1. Mas esse valor é altamente improvável de acontecer com valores monetários.
Só que, eu não usaria o long “puro”, porque você precisaria sempre se lembrar de dividir por cem toda vez que quiser exibi-lo. E isso, além de tedioso, é sujeito a erros por esquecimento. Uma solução é usar BigDecimal; a outra é criar uma classe chamada Dinheiro, onde você colocaria o métodos de cálculos financeiros nela e, possivelmente, um atributo do tipo long.
Concordo. Dinheiro não se divide, se aloca.
[quote=luiz_renato]Dá uma olhada em http://www.javabuilding.com/academy/patterns/money.html que de repente ajuda…
Luiz Renato[/quote]
E no livro Patterns of Enterprise Application Architecture, do Martin Fowler (que foi quem catalogou o pattern).
[]´s
Aritmética de ponto fixo (que vc está pensando em usar) é ainda mais imprecisa do que a de ponto flutuante.
Use mesmo a classe BigDecimal. Infelizmente o java não tem sobrecarga de operadores, por isso ela fica chata de ser aplicada.
Mas só é trabalhosa, não difícil.
Pode-se usar long, mas tenha em mente os controles que terá que fazer na representação da parte decimal (tipo, 0.01 x 0,01 = 0,0001 - centavos sendo aplicado juros, por exemplo).
Mas não faça divisão (transformando em double).
Eu prefiro BigDecimal. Mas se têm receio de usar, crie uma classe com o mesmo fim (dá trabalho mas vc têm um melhor controle).