Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Задача расчёта кредита / 6 сообщений из 6, страница 1 из 1
31.01.2013, 17:29:57
    #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
31.01.2013, 18:52:09
    #38132838
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача расчёта кредита
Разрядность при расчете процентов попробуйте выставить не 2 а 6 или больше, сами определите при дебаге сколько вам требуется.
И я бы использовал халф_ап все же.
...
Рейтинг: 0 / 0
31.01.2013, 19:04:02
    #38132855
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача расчёта кредита
Ошибка в алгоритме, последний платеж может быть меньше аннуитета.
На самом деле нужен цикл while (rest>0)
...
Рейтинг: 0 / 0
01.02.2013, 09:40:56
    #38133241
Alexey123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача расчёта кредита
NixicИ я бы использовал халф_ап все же.
Почему HALF_UP? Наверное это должно регламентироваться бизесс задачей данного предприятия.


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


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