BrazilUtils 0.2 - Features Tutorial - Money

Este é um itulitário bem mais interesante
A classe Money representa uma quantidade de dinheiro em uma moeda.

O objetivo é simplificar os calculos com dinheiro de forma que não se perca nem 1 centavo.

Ela suporta qualquer moeda já que usa a classe Currency do java padrão.
Para facilitar podemos criar dinheiro em reais usando o método utilitário na classe Brazil

Money venda = Brazil.reais(985);
Money dollars = new Money(300, Currency.USD);

A classe permite somar e subtrair valores desde que na mesma moeda
Se tentar somar valores de moeda diferentes acontece uma RuntimeException

Money frete = Brazil.reais(15);

Money total = venda.plus(frete);
Money totalus = dollars.plus(frete); // isto dá um erro AritmethicException

permite multiplicar e dividir. Multiplicar é bem simples, mas dividir não

Existem dois tipos de divisão de dinheiro. Matemática e Financeira.
A primeira faz a conta que todos estamos habituados, mas despresa valores que não se possam colocar em dinheiro. A segunda impede que dinheiro se crie ou desapareça durante as operações

Money quociente =  total.divide(3); // total é 100
// quociente é 33,33 ,

o resto é desprezado, mas pode ser obtido com

Money[] quocienteEresto=  total.divideAndRemainder(3); // total é 100
// quocienteEresto[0] é 33,33  e quocienteEresto[1] é 0,01

Mas imagine que está fazendo venda parcelada, como fazer para não perder dinheiro ?

Money[] parcelas=  total.allocate(3); // total é 100
// parcelas[0] é 33,34 e as outras são 33,33

O método allocate faz a divisão mas não desaparece com o dinheiro , que é o que normalmente queremos fazer.

O método deixa ainda alocar percentagem diferentes, por exemplo 30%+30%+40%

Money[] parcelas=  total.allocate(int[]{30,30,40}); // total é 100

Acho que isso já ajuda sem obrigar a trabalhar com BigDecimal.