Ответ
Для денежных сумм и любых финансовых расчетов, требующих абсолютной точности, используйте 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:
- Конструктор из строки: Всегда создавайте
BigDecimalиз строки (new BigDecimal("10.50")), а не изdouble, чтобы избежать передачи уже неточного значения. - Задание масштаба и округления: Используйте
setScale()для контроля над десятичными разрядами.BigDecimal price = new BigDecimal("19.99"); BigDecimal taxRate = new BigDecimal("0.20"); BigDecimal tax = price.multiply(taxRate).setScale(2, RoundingMode.HALF_UP); - Использование констант: Для часто используемых значений применяйте
BigDecimal.ONE,BigDecimal.ZERO,BigDecimal.TEN.
Для хранения в базе данных используйте соответствующий точный числовой тип (например, DECIMAL(19,4)).