Página 1 de 2

Tipo Money

MensagemEnviado: Seg Mai 09, 2011 11:19 pm
por jtakata
Olá Rógel e demais membros.

O método setPrecision da classe Money permite que eu altere a quantidade de casas decimais de uma variável?
Posso utilizar outros métodos (multiplicação, divisão etc) em campos com precisões diferentes e ele se vira pra ajustar?
Eu pensei em usar em conversão de moedas, calculo de porcentagem etc.
Por exemplo, taxa de câmbio = 1,6885, valor em US$ = 1.350,00 daria 2.279,4750. Suponho que se colocar o resultado em outro campo Money com arredondamento ROUND_HALF_UP daria R$2.279,48.
Estou certo?

Grato e abraços,
Jorge

Re: Tipo Money

MensagemEnviado: Qui Mai 12, 2011 1:18 pm
por rogelgarcia
No seu teste, qual foi o valor retornado?

Re: Tipo Money

MensagemEnviado: Qui Mai 12, 2011 4:56 pm
por jtakata
Na verdade eu não havia testado nada.
Fiz alguns testes agora:
Money valor = new Money(1350.00);
Money valor1 = new Money(0);
Money taxa =new Money(1.6885);
valor1 = valor.multiply(taxa);
O resultado foi 2.279,48, ou seja, está correto.
Ainda não fiz testes de persistência do tipo Money mas lembro que você disse que ele deve ser mapeado como BigInt.

Re: Tipo Money

MensagemEnviado: Qui Mai 12, 2011 5:51 pm
por rogelgarcia
Exatamente.

Essa classe Money, na verdade foi um colega meu que fez e ele se baseou num artigo para escrevê-la.
Talvez possam existir alguns detalhes da classe Money que não te atendam por você ter alguns requisitos especiais. Talvez precise de mais funcionalidades.

Se for o caso, a minha sugestão é que copie o código da classe Money para uma classe sua, e modifique da maneira que achar necessário. Lembrando que isso só será necessário no caso de a classe Money não te atender.

Até mais

Re: Tipo Money

MensagemEnviado: Qui Mai 12, 2011 6:25 pm
por jtakata
Pois é...
Acabei de fazer um teste de persistência, conforme trecho abaixo (já mexi e remexi o campo taxaDeCambio e o resultado não mudou):
--------------------------------------
public class Valores{
private Long id;
private Money valorBase = new Money(0);
private Money taxaDeCambio = new Money(0);
private Money resultado = new Money(0);
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="sq_valores")
public Long getId(){
return this.id;
}
public Money getValorBase(){
return this.valorBase;
}
public Money getTaxaDeCambio(){
this.taxaDeCambio.setPrecision(10000);
return this.taxaDeCambio;
}
@Transient
public Money getResultado(){
return this.resultado=this.valorBase.multiply(this.taxaDeCambio);
}
}
--------------------------------------
O que era Money foi criado na tabela como BigInt (criado automaticamente).
O problema é que eu queria a taxa com 4 casas decimais mas na tela fica fixo com duas.
Se isso não tiver solução, vou ver o que fazer.

Abraços,
Jorge

Re: Tipo Money

MensagemEnviado: Qui Mai 12, 2011 9:46 pm
por jtakata
Eu dei uma olhada na classe Money.
Eu vi que tem valor fixo 2 no "setScale" nos métodos "round()" e "toLong()".
Se criar uma variável "scale" com default 2 e outros métodos "round(int scale)" e "toLong(int scale)" e mexer no método "toString()" para formatar de acordo com o scale e mais um método "setScale(int scale)", acho que deve atender o que eu preciso.
Ou seja, se eu quiser um Money com 4 casas decimais, bastaria eu chamar o método setScale(4), assim, a partir daí se estaria trabalhando com 4 casas decimais para uma determinada variável.
Talvez tenha de mexer em mais alguma coisa (por exemplo, nas operações aritméticas) mas isso eu não consegui enxergar.
O meu raciocínio está correto?

Re: Tipo Money

MensagemEnviado: Seg Mai 16, 2011 11:57 pm
por rogelgarcia
Está correto.. Quando mencionei que alguma alteração pudesse ser necessária, me referia a justamente o scale.

Faça testes para verificar se os cálculos estão de acordo. Mas é esse o caminho mesmo.

Re: Tipo Money

MensagemEnviado: Ter Mai 17, 2011 12:00 am
por rogelgarcia
Um outro detalhe...

Ao salvar a classe no banco de dados.. é assumido que existem duas casas decimais.

Pode ser interessante que você trabalhe apenas com 4 casas sempre.. ao salvar e ler do banco de dados..

Existem algumas multiplicacoes ou divisoes por 100 no código. Isso tem que ser atualizado para 10000, caso deseje usar 4 casas decimais.

Como pode-se perder o controle de quantas casas decimais devem ser utilizadas foi fixado na classe, o uso de 2 casas.

Pode ser interessante manter o número de casas decimais fixo. No seu caso, pode fixar em 4 (e atualizar as multiplicacoes e divisoes)

Quando desejar mostrar o valor com apenas duas casas, pode fazer um método que retorne o valor com 2 casas apenas para visualizacao...

Re: Tipo Money

MensagemEnviado: Ter Mai 17, 2011 12:03 am
por rogelgarcia
Note que a classe Money serve para facilitar o trabalho com valores monetários. No entanto, ela foi feita de forma simples. Para aplicações do dia a dia, ela é suficiente. Para aplicações financeiras, podem ser necessários outros algoritmos.

Re: Tipo Money

MensagemEnviado: Ter Mai 17, 2011 4:59 pm
por jtakata
Acho que vou precisar de algo mais flexível.
Vou pesquisar a classe BigDecimal pra ver se me atende.
Outra coisa que percebi é que a classe Money está "integrada" ao Next.
Concluí isso pelo fato de o Money ser renderizado na tela com duas casas decimais. Estou certo?
Então, se eu criar uma nova classe, onde devo mexer para que esta também seja "integrada" ao Next?