l3ug1m:
estou usando padrão Money sim, mais com BigDecimal como valor encapsulado,
depois deste problema, tive outro problema, dividindo 560 por 1.86 da 301.07526881 arredondando da 301.08 e quando eu multiplicava novamente por 1.86 para retornar o 560 dava 560.01, o problema tava no MathContext passado na divisão, consegui resolver passando o MathContext.DECIMAL128 na divisão e no retorno usando o setScale(2, RoundingMode.HALF_EVEN),
Mas entenda que isso é uma gambiarra. matemáticamente, depois que vc aredonda o numero não é mais o mesmo, logo não é possivel fazer a operação inversa e esperar o mesmo numero que antes. depois de obter 301.08 vc não pode multiplicar de volta. Isso não faz sentido.
A divisão de dinheiro acontece normalmente de 3 formas:
dinheiro / dinheiro = fator (por exemplo, quanto % eu ganhei de algum investimento)
dinheiro / fator = dinheiro * (1 / fator) = para saber uma percentagem por exemplo.
dinheiro / inteiro = distribuição. que é na realidade a subtração sucessiva do valor e serve para criar parcelas. Este é o item que resolve o problem
tenho 10 carros e 3 pessoas, quantos carros ganha cada pessoa. A reposta é 3 , não 4, e nem 3 e 1/3 porque carros que não são inteiros não são mais carros. Quando se divide dinheiro tem que se pensar se estamos usando um numero de fator, ou se estamos distribuido. E é ai que a classe money brilha.
Em termos matemáticos dinheiro não forma um anel.