From a5264f4dff30dbc0107e05b999973221addbfee6 Mon Sep 17 00:00:00 2001 From: sb Date: Tue, 7 Jul 2026 23:22:02 +0900 Subject: [PATCH] =?UTF-8?q?fix(repayment):=20=EC=9B=90=EB=A6=AC=EA=B8=88?= =?UTF-8?q?=EA=B7=A0=EB=93=B1=20=EB=A7=88=EC=A7=80=EB=A7=89=20=ED=9A=8C?= =?UTF-8?q?=EC=B0=A8=EC=97=90=20=EC=9E=94=EC=97=AC=20=EB=B0=98=EC=98=AC?= =?UTF-8?q?=EB=A6=BC=20=ED=95=A9=EC=82=B0=20=E2=80=94=20=EA=BC=AC=EB=A6=AC?= =?UTF-8?q?=20=ED=9A=8C=EC=B0=A8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 매월 이자 반올림 누적으로 마지막 정상 회차 뒤 수십원(원금 62·이자 1) 추가 회차 생기던 문제. 잔액<=월상환금이면 마지막 회차로 남은 잔액을 한 번에 정산(은행 동일) Co-Authored-By: Claude Opus 4.8 --- src/utils/repayment.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/utils/repayment.js b/src/utils/repayment.js index 04cf531..afd2f8c 100644 --- a/src/utils/repayment.js +++ b/src/utils/repayment.js @@ -76,14 +76,18 @@ export function loanSchedule(w, now = currentYm(), cap = 600) { if (fixed > 0) { while (bal > 0 && rows.length < cap) { const interest = Math.round(bal * r) - let principal = fixed - interest - if (principal <= 0) { + if (fixed <= interest) { // 상환금이 이자에 못 미침(데이터 이상) → 더 진행 못함 - rows.push({ label: label(y, m), principal: Math.max(0, principal), interest, total: fixed, balance: bal }) + rows.push({ label: label(y, m), principal: 0, interest, total: fixed, balance: bal }) break } - principal = Math.min(principal, bal) - bal = Math.max(0, bal - principal) + // 마지막 회차: 남은 잔액 한 번에 정산(은행은 잔여 반올림을 마지막 납입에 합산 → 추가 회차 안 생김) + if (bal <= fixed) { + rows.push({ label: label(y, m), principal: bal, interest, total: bal + interest, balance: 0 }) + break + } + const principal = fixed - interest + bal = bal - principal rows.push({ label: label(y, m), principal, interest, total: principal + interest, balance: bal }) ;({ y, m } = addMonths(y, m, 1)) }