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

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

Ответ

Для денежных сумм и любых финансовых расчетов, требующих абсолютной точности, используйте BigDecimal.

Почему BigDecimal, а не double? Типы double и float используют двоичную арифметику с плавающей точкой, что приводит к ошибкам округления для десятичных дробей.

// ОШИБКА: Использование double для денег
double total = 0.1 + 0.2; // Результат: 0.30000000000000004

// ПРАВИЛЬНО: Использование BigDecimal
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal correctTotal = a.add(b); // Результат: 0.3 (точно)

Ключевые практики при работе с BigDecimal:

  1. Конструктор из строки: Всегда создавайте BigDecimal из строки (new BigDecimal("10.50")), а не из double, чтобы избежать передачи уже неточного значения.
  2. Задание масштаба и округления: Используйте setScale() для контроля над десятичными разрядами.
    BigDecimal price = new BigDecimal("19.99");
    BigDecimal taxRate = new BigDecimal("0.20");
    BigDecimal tax = price.multiply(taxRate).setScale(2, RoundingMode.HALF_UP);
  3. Использование констант: Для часто используемых значений применяйте BigDecimal.ONE, BigDecimal.ZERO, BigDecimal.TEN.

Для хранения в базе данных используйте соответствующий точный числовой тип (например, DECIMAL(19,4)).