Ответ
Для денежных операций необходимо использовать BigDecimal, так как он обеспечивает точную десятичную арифметику с контролем округления.
Почему не double или float?
Типы с плавающей запятой (double, float) используют двоичное представление, что приводит к ошибкам округления при операциях с десятичными дробями (например, 0.1). Это неприемлемо для финансовых расчётов.
Пример использования BigDecimal:
BigDecimal price = new BigDecimal("19.99");
BigDecimal taxRate = new BigDecimal("0.20"); // 20%
BigDecimal tax = price.multiply(taxRate);
BigDecimal total = price.add(tax).setScale(2, RoundingMode.HALF_UP);
System.out.println(total); // 23.99
Критически важные правила:
- Всегда используй конструктор
BigDecimal(String), а неBigDecimal(double), чтобы избежать ошибок на этапе создания. - Указывай
RoundingMode(например,HALF_UP) для операций деления иsetScale. - Для сравнения используй методы
compareTo(), а неequals()(последний сравнивает и значение, и масштаб).