Как происходит начисление процентов на счета и вклады
Что проверяют
Есть ли у вас понимание предметной области и умеете ли вы считать деньги в Java без потери копеек. Формулы простых и сложных процентов знают все, поэтому следом спросят, почему нельзя double, как округлять и что будет, если ночной расчёт упал на середине.
Как отвечать
Сначала разведите два понятия, которые путают чаще всего:
- начисление: проценты считаются ежедневно на остаток на конец дня и копятся на отдельном счёте. Формула: остаток × годовая ставка / число дней в году, обычно фактические 365 или 366;
- выплата или капитализация: раз в месяц, квартал или в конце срока накопленное переводится клиенту или прибавляется к телу вклада. Капитализация и даёт эффект сложного процента.
Пример: 1 000 000 рублей под 18% годовых. Если округлять каждый день, за 30 дней выйдет 30 × 493,15 = 14 794,50, если сумму за период, 14 794,52. Правило задаёт методика продукта, и на миллионах счетов разница заметна.
Дальше техника:
- деньги: только
BigDecimalс явным масштабом иRoundingMode(HALF_EVENилиHALF_UP, как требует методика). Создавать черезnew BigDecimal("0.18")илиBigDecimal.valueOf, не изdouble; - даты:
LocalDate,ChronoUnit.DAYS.between,Year.isLeap(). Период через границу года делится на части с разной базой; - пакетная обработка: закрытие дня как задание в Spring Batch, чанками, с возможностью перезапуска;
- идемпотентность: уникальный ключ «счёт плюс дата расчёта», чтобы повторный запуск не начислил дважды;
- история ставок: ставка хранится с датой начала действия, бывают ступени по сумме и пересчёт при досрочном закрытии;
- учёт: каждое начисление оформляется проводками по двойной записи.
Где спотыкаются
Считают в double. 0.1 + 0.2 уже не равно 0.3, а в банке расхождение даже в копейку означает разбор со сверкой.
Смешивают начисление и выплату и предлагают один ежемесячный расчёт по формуле сложного процента. Реальная система работает от ежедневного остатка, который меняется от пополнений и снятий.
Не думают о падении пакета посередине. Без идемпотентного ключа перезапуск начислит проценты второй раз части клиентов.