powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача расчёта кредита
6 сообщений из 6, страница 1 из 1
Задача расчёта кредита
    #38132659
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени. Начитался книг и форумов про использование BigDecimal в качестве хранения денежных единиц. Для закремпления материла решил написать программку расчёта платежей по кредиту:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
	public static void main(String[] args) {
		BigDecimal totalSum = new BigDecimal("3000000.00");
		BigDecimal firstPay = new BigDecimal("500000.00");;
		BigDecimal procent = new BigDecimal("13");;
		int periodInMonths = 60;
		
		System.out.println("Сумма кредита:"+totalSum);
		System.out.println("Первый взнос:"+firstPay);
		System.out.println("Процент:"+procent);
		System.out.println("Срок кредитования:"+periodInMonths);

		BigDecimal rest = totalSum.subtract(firstPay);
		System.out.println("Остаток:"+rest);
		BigDecimal repaymentInMonth = rest.divide(BigDecimal.valueOf(periodInMonths),2,RoundingMode.HALF_EVEN);
		System.out.println("Ежемесяный платёж без процентов:"+repaymentInMonth);
		BigDecimal procentMonth = procent.divide(BigDecimal.valueOf(12),4,RoundingMode.HALF_EVEN);
		System.out.println("Ежемесячный процент:"+procentMonth);

		for (int i = 0; i < periodInMonths; i++) {		
			BigDecimal monthPayForProcent=rest.multiply(procentMonth).divide(BigDecimal.valueOf(100),2,RoundingMode.HALF_EVEN);
			System.out.println("Отчисления по процентам:"+monthPayForProcent);
			System.out.println("Общий платёж:"+monthPayForProcent+" + "+repaymentInMonth);
			rest=rest.subtract(repaymentInMonth);
			System.out.println("Остаток:"+rest);
		}
	}



Результат:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Сумма кредита:3000000.00
Первый взнос:500000.00
Процент:13
Срок кредитования:60
Остаток:2500000.00
Ежемесяный платёж без процентов:41666.67
Ежемесячный процент:1.0833
Отчисления по процентам:27082.50
Общий платёж:27082.50 + 41666.67
Остаток:2458333.33
....
Отчисления по процентам:902.75
Общий платёж:902.75 + 41666.67
Остаток:41666.47
Отчисления по процентам:451.37
Общий платёж:451.37 + 41666.67
Остаток:-0.20


Появившийся остаток -0.20руб. может быть результатом деления общей суммы на кол-во месяцев с округлением.
RoundingMode.HALF_EVEN - Банковское округление (англ. banker's rounding) — округление происходит к ближайшему чётному, то есть 2,5 = 2, 3,5 = 4.
Верно ли решена мною задача и корректно ли я использовал BigDecimal. Спасибо.
...
Рейтинг: 0 / 0
Задача расчёта кредита
    #38132838
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разрядность при расчете процентов попробуйте выставить не 2 а 6 или больше, сами определите при дебаге сколько вам требуется.
И я бы использовал халф_ап все же.
...
Рейтинг: 0 / 0
Задача расчёта кредита
    #38132855
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибка в алгоритме, последний платеж может быть меньше аннуитета.
На самом деле нужен цикл while (rest>0)
...
Рейтинг: 0 / 0
Задача расчёта кредита
    #38133241
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicИ я бы использовал халф_ап все же.
Почему HALF_UP? Наверное это должно регламентироваться бизесс задачей данного предприятия.


ivanraОшибка в алгоритме, последний платеж может быть меньше аннуитета.
На самом деле нужен цикл while (rest>0)
Согласен что последний платеж может быть меньше аннуитета для выравнивания ошибок округления. Но использование while не совсем верно, ведь в договоре четко прописывается срок кредитования. Думаю достаточно добавить проверку после цикла что rest=0 и Exception если это не так (ошибка алгоритма).
...
Рейтинг: 0 / 0
Задача расчёта кредита
    #38133301
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы не видели кредитных договоров. На самом деле, в зависимости от конкретных условий (дата выдачи не совпадает с концом процентного периода, учитывается реальное количество дней в месяце, а не 30 как в примере, очень большой срок кредита), последний платеж может быть не только меньше ежемесячного, но и вообще может быть равным нулю.
Срок кредита используется в формуле расчета ежемесячного платежа, но после этого, при расчете графика срок напрямую уже не используется, на фактический остаток долга начисляются проценты за месяц, а оставшаяся часть платежа уменьшает остаток долга. В итоге, в большинстве случаев, получаем график с нужным количеством строк. Но иногда, в крайних случаях, количество строк в графике может не совпасть со сроком кредита.
В любом случае, надо внимательно читать кредитный договор и реализовывать именно то, что там написано, а не как в данном примере, где каждый месяц 30 дней.
...
Рейтинг: 0 / 0
Задача расчёта кредита
    #38133533
Alexey123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra, спасибо за развёрнутый ответ. Я попробую найти кредитный договор и переписать логику в соотвествии с ним и тем что Вы сказали. В принципе я хотел узнать правильно-ли я использовал BigDecimal, но написать алгоритм по всем правилам будет тоже интересно. Может позже размещу реализацию.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача расчёта кредита
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]