Valores monetários

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 ???

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…

O melhor é usar um Double

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

[quote=LuksS]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[/quote]

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.

Do seguinte trecho do artigo

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

[quote=LuksS]Do seguinte trecho do artigo

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

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.

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.

Galera,
Odeio ressuscitar tópico, mas como vocês já passaram por isso, vou postar meu post aqui, de repente alguém possa me ajudar.

Valeu.