Para Calculos Financeiros, o que devo usar? BigDecimal ou long?

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.

Dá uma olhada em http://www.javabuilding.com/academy/patterns/money.html que de repente ajuda…

Luiz Renato

[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).