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.