| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/09/2009 14:41:54
|
LuksS
JavaTeenager
![[Avatar]](/images/avatar/e86fdb256522aa912cbff6c9ee251fa4.png)
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/ |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/09/2009 16:19:59
|
Danieldt
HelloWorld
![[Avatar]](/images/avatar/617afc7c38159e7b80ef032f40065615.png)
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...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/09/2009 16:31:43
|
kikostyle
JavaChild
![[Avatar]](/images/avatar/1a944d032cfa82fd3fccb56ba18fb914.png)
Membro desde: 04/05/2007 15:18:53
Mensagens: 109
Offline
|
O melhor é usar um Double
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/09/2009 18:57:42
|
LuksS
JavaTeenager
![[Avatar]](/images/avatar/e86fdb256522aa912cbff6c9ee251fa4.png)
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/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/09/2009 09:51:20
|
sergiotaborda
Forum Spammer
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/09/2009 19:46:51
|
LuksS
JavaTeenager
![[Avatar]](/images/avatar/e86fdb256522aa912cbff6c9ee251fa4.png)
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/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2009 09:41:40
|
sergiotaborda
Forum Spammer
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/09/2009 20:22:03
|
LuksS
JavaTeenager
![[Avatar]](/images/avatar/e86fdb256522aa912cbff6c9ee251fa4.png)
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/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/10/2009 09:31:18
|
sergiotaborda
Forum Spammer
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
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 |
|
|
 |
|
|