Я бы также порекомендовал вам использовать только BigDecimal для ВСЕЙ арифметики, которая может включать валюту.
Убедитесь, что вы всегда используете конструктор String BigDecimal. Зачем? Попробуйте следующий код в тесте JUnit:
assertEquals(new BigDecimal("0.01").toString(), new BigDecimal(0.01).toString());
Вы получите следующий вывод:
expected:<0.01[]> but was <0.01[000000000000000020816681711721685132943093776702880859375]>
По правде говоря, вы не можете хранить ТОЧНО 0,01 как «двойную» сумму. Только BigDecimal хранит номер, который вам нужен ИМЕННО , как вы хотите.
И помните, что BigDecimal является неизменным. Будет скомпилировано следующее:
BigDecimal amount = new BigDecimal("123.45");
BigDecimal more = new BigDecimal("12.34");
amount.add(more);
System.out.println("Amount is now: " + amount);
но результат будет:
Сумма сейчас: 123,45
Это потому, что вам нужно присвоить результат новой (или той же) переменной BigDecimal.
Другими словами:
amount = amount.add(more)