Calculate how much interest and time you save by making additional principal payments.
Please fill in all fields with valid numbers.
Calculation Results
Original Monthly Payment (Principal & Interest):$0.00
New Monthly Payment (with Extra):$0.00
Total Interest Saved:$0.00
Time Saved:0 Years, 0 Months
New Payoff Duration:0 Years, 0 Months
How Extra Payments Affect Your Mortgage
Mortgage loans are typically amortized, meaning the monthly payment is split between paying off the principal balance and the interest. In the early years of a mortgage, the majority of your payment goes toward interest. However, by making extra payments toward the principal, you reduce the balance on which interest is calculated for future months.
Even a small additional payment, such as $50 or $100 per month, can drastically reduce the total interest paid over the life of the loan and shorten the repayment term by several years.
Why Use This Calculator?
This tool helps homeowners visualize the impact of prepayments. By inputting your current balance, interest rate, and remaining term, you can see exactly how much hard-earned money you can save.
Interest Savings: See the exact dollar amount you keep in your pocket instead of paying the bank.
Debt-Free Date: Calculate how much faster you will own your home outright.
Budgeting: Determine an affordable extra payment amount that aligns with your financial goals.
The Mathematical Formula
Standard mortgage payments are calculated using the amortization formula:
M = P [ i(1 + i)^n ] / [ (1 + i)^n – 1 ]
Where:
M = Total monthly payment P = Principal loan amount i = Monthly interest rate (Annual Rate / 12) n = Number of months required to repay the loan
When you add an extra payment, the principal (P) decreases faster than the schedule dictates, reducing the 'n' (number of months) required to reach a zero balance.
function calculateMortgageSavings() {
// 1. Get Input Values
var balanceInput = document.getElementById('mpc_balance').value;
var rateInput = document.getElementById('mpc_rate').value;
var yearsInput = document.getElementById('mpc_years').value;
var extraInput = document.getElementById('mpc_extra').value;
var resultBox = document.getElementById('mpc_result');
var errorBox = document.getElementById('mpc_error');
// 2. Parse values
var P = parseFloat(balanceInput);
var annualRate = parseFloat(rateInput);
var years = parseFloat(yearsInput);
var extra = parseFloat(extraInput);
// 3. Validation
if (isNaN(P) || isNaN(annualRate) || isNaN(years) || P <= 0 || years <= 0) {
errorBox.style.display = 'block';
resultBox.style.display = 'none';
return;
}
// Handle empty extra payment as 0
if (isNaN(extra) || extra 0 && monthsPassed < maxMonths) {
var interestForMonth = currentBalance * r;
var principalForMonth = actualPayment – interestForMonth;
// If the remaining balance is less than the payment
if (currentBalance < principalForMonth) {
principalForMonth = currentBalance;
// Recalculate interest for the final partial month?
// Usually simplified to paying off rest.
}
totalNewInterest += interestForMonth;
currentBalance -= principalForMonth;
monthsPassed++;
}
// 8. Calculate Results
var interestSaved = totalOriginalInterest – totalNewInterest;
if (interestSaved < 0) interestSaved = 0; // Edge case
var monthsSaved = n – monthsPassed;
var yearsSaved = Math.floor(monthsSaved / 12);
var remainingMonthsSaved = Math.round(monthsSaved % 12);
var newYears = Math.floor(monthsPassed / 12);
var newMonths = Math.round(monthsPassed % 12);
// 9. Format Currency
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
// 10. Update DOM
document.getElementById('res_orig_pmt').innerHTML = formatter.format(monthlyPayment);
document.getElementById('res_new_pmt').innerHTML = formatter.format(actualPayment);
document.getElementById('res_int_saved').innerHTML = formatter.format(interestSaved);
document.getElementById('res_time_saved').innerHTML = yearsSaved + " Years, " + remainingMonthsSaved + " Months";
document.getElementById('res_new_term').innerHTML = newYears + " Years, " + newMonths + " Months";
// Show result box
resultBox.style.display = 'block';
}