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 ???
Valores monetários
9 Respostas
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
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.
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??
Do seguinte trecho do artigoEu 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.
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.