Valores monetários  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
LuksS
JavaTeenager
[Avatar]

Membro desde: 08/01/2008 10:55:41
Mensagens: 172
Offline

Me surgiu essa dúvida: Em um sistema de automação comercial, qual a melhor forma de representar um valor monetário?? Como um objeto ou como um tipo de dados primitivo ???

http://lucassimao.wordpress.com/
Danieldt
HelloWorld
[Avatar]

Membro desde: 25/08/2009 16:42:53
Mensagens: 18
Offline

voce esta fazendo sem banco de dados??

bom.. ai vai depender da necessidade do sistema.. a vantagem de se fazer uma classe para isso é que voce estara apto a disponibilizar para ela como por exemplo, conversão de moeda, de forma semântica e correta... mais se for só pra resolver o problema de manter a quantia de dinheiro de um obj Conta por exemplo, só um atributo float já resolve qualquer quantia plausível...
[MSN]
kikostyle
JavaChild
[Avatar]

Membro desde: 04/05/2007 15:18:53
Mensagens: 109
Offline

O melhor é usar um Double
LuksS
JavaTeenager
[Avatar]

Membro desde: 08/01/2008 10:55:41
Mensagens: 172
Offline

Obrigado! Com suas dicas eu conclui que o melhor no meu caso seria usar um BigDecimal p/ encapsular o valor e facilitar o arredondamento!
vlw

http://lucassimao.wordpress.com/
sergiotaborda
Forum Spammer
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3201
Offline

LuksS wrote:Obrigado! Com suas dicas eu conclui que o melhor no meu caso seria usar um BigDecimal p/ encapsular o valor e facilitar o arredondamento!
vlw


O melhor de tudo é usar o padrão Money. Vc não trabalha com numeros decimais e por isso não tem perda por arredondamento.
Money é a forma de fato para trabalhar com dinheiro o resto é gambiarra.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
LuksS
JavaTeenager
[Avatar]

Membro desde: 08/01/2008 10:55:41
Mensagens: 172
Offline

Do seguinte trecho do artigo

Do ponto de vista técnico ha muito tempo que é sabido que tipos numéricos como double ou float não são suficientes para elaborar algoritmos que lidam com dinheiro e, em Java, nos vemos obrigados a usar BigDecimal. Contudo a classe BigDecimal tem as suas peculiaridades que acabam atrapalhando mais do que ajudam porque embora forneçam mecanismos de calculo, não fornece um mecanismo de controle de unidades.


Eu posso utilizar a classe BigDecimal sem medo de estar cometendo gambiarras caso eu Não necessite de conversões monetárias??

http://lucassimao.wordpress.com/
sergiotaborda
Forum Spammer
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3201
Offline

LuksS wrote:Do seguinte trecho do artigo

Do ponto de vista técnico ha muito tempo que é sabido que tipos numéricos como double ou float não são suficientes para elaborar algoritmos que lidam com dinheiro e, em Java, nos vemos obrigados a usar BigDecimal. Contudo a classe BigDecimal tem as suas peculiaridades que acabam atrapalhando mais do que ajudam porque embora forneçam mecanismos de calculo, não fornece um mecanismo de controle de unidades.


Eu posso utilizar a classe BigDecimal sem medo de estar cometendo gambiarras caso eu Não necessite de conversões monetárias??


Nas escala de pior para melhor opção temos

double e float
BigDecimal
Ratio
Money
Money (usando ratio internamente)

BigDecimal é melhor que double pq vc pode representar potencias negativas de 10 sem problemas (ou seja, centavos)
mas ainda é um decimal. Vc será tentado a escrever 1/3 do mesmo jeito e terá uma dizima infinita do mesmo jeito...
só que uma dizima infinita é irrepresentável, mesmo com bigDecimal. E pior que isso, esse valor não é uma quantidade monetária
aceitável. 1/3 dá 0,33 + 0,33 + 0,33 + 0,01 centavos Esta é a divisão correta de dinheiro por um numero inteiro.

Bom, então ai vc usa Ratio. Ratio é um padrão para numeros em que vc utiliza um valor para numerador e outro para denominador nunca fazendo a divisão real até ao fim do calculo. assim 1/ 3 * 3 = 1 sempre. Vc não consegue isso co double ou float nem bigdecimal.

Mas ratio é para numeros, não dinheiro. Não ha associação à moeda.
Ai vc usa Money. Preferivelmene com ratio internamente para ter calculos mais exatos (ou seja, fazendo menos divisões)

Mesmo quando a moeda é sempre a mesma Money tem vantagem por sem mais fortemente tipado. Numeros podem ser qq coisa, Money só pode ser dinheiro. um metodo chamado calculaJuro(Money) é auto-explicativo. Isto melhora imensamente a clareza do seu codigo e impede erros.

enfim, o ponto não é se é gambiarra ou não. nenhum deles é gamb. O ponto é seguir o principio que diz que vc deve sempre usar o melhor tipo possivel. É mesmo principio que obriga vc a usar numeros em vez de string e string em vez de array de char...

O tipo "dinheiro" quando não é bem modelado causa muitos problemas porque vc começa a perder centavos sem perceber e isso causa prejuizo enorme porque em 100 transações diárias (que é pouco) vc perde 1 unidade. em 356 dias vc perde 356 unidades, e assim vai.

O golpe final do padrão money sobre os outros é o conhecimento do dominio.
Porque o objeto conhece a moeda, ele sabe quantas casas decimais existem na moeda. (nem todas as moedas têm 2 casas decimais como o real, o yen, por exemplo, não tem nenhuma). Isto permite que ele converta qq decimal em um inteiro e depois de volta.
Então quando vc cria o objeto vc passa um valor decimal (utilizando uma String e nunca um double) , mas ele faz as contas com inteiros - muito mais rápido e sem problemas de arredondamento. No fim ele converte de volta para um decimal.

Dê uma olhada como se pode usar o money e um exemplo de implementação usando o padrão Ratio.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
LuksS
JavaTeenager
[Avatar]

Membro desde: 08/01/2008 10:55:41
Mensagens: 172
Offline

Estou usando o padrão money! Mas surgiu outra dúvida. E quanto a porcentagens? Existe algum padrão para representá-los?

http://lucassimao.wordpress.com/
sergiotaborda
Forum Spammer
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3201
Offline

LuksS wrote:Estou usando o padrão money! Mas surgiu outra dúvida. E quanto a porcentagens? Existe algum padrão para representá-los?


Vc pode usar o padrão Ratio que falei antes. Já que todas as percentagens são numeros divididos por 100. 88% = 88/100
e 88,99% = 8899/10000 . Co ratio vc sempre trabalha com numeros inteiros durante o máximo de tempo possivel delegando a adivisão final apenas para o fim do calculo. É a forma que se usa na matemática onde se usam frações para não calcular a divisão explicitamente.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team