Какой класс в Java следует использовать для точных денежных расчётов?

«Какой класс в Java следует использовать для точных денежных расчётов?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для денежных операций необходимо использовать 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

Критически важные правила:

  1. Всегда используй конструктор BigDecimal(String), а не BigDecimal(double), чтобы избежать ошибок на этапе создания.
  2. Указывай RoundingMode (например, HALF_UP) для операций деления и setScale.
  3. Для сравнения используй методы compareTo(), а не equals() (последний сравнивает и значение, и масштаб).