Deciding whether to refinance your mortgage is a significant financial move. This calculator helps you determine if the long-term interest savings outweigh the upfront closing costs. To get started, you'll need your current remaining balance, your current interest rate, and the estimated interest rate for a new loan.
Understanding the Break-Even Point
The "Break-Even Point" is perhaps the most critical metric. It represents the number of months it will take for your monthly savings to cover the cost of the refinance (closing costs). For example, if your closing costs are $5,000 and you save $200 per month, your break-even point is 25 months. If you plan to stay in your home longer than the break-even period, refinancing usually makes financial sense.
Real-World Example
Imagine you have a $300,000 balance on a 30-year mortgage at 6.5%. Your monthly principal and interest payment is approximately $1,896. If you refinance into a new 30-year loan at 4.5%, your new payment drops to $1,520. That is a monthly savings of $376. If the closing costs for this new loan are $6,000, you will break even in roughly 16 months.
Key Factors to Consider
Closing Costs: These typically range from 2% to 5% of the loan amount.
Loan Term: Resetting a 25-year remaining term back to a 30-year term lowers your payment but may increase the total interest paid over the life of the loan.
Tax Implications: Mortgage interest is often tax-deductible; lowering your interest might change your tax deduction profile.
function calculateRefinance() {
var balance = parseFloat(document.getElementById('currentBalance').value);
var costs = parseFloat(document.getElementById('closingCosts').value);
var oldRate = parseFloat(document.getElementById('oldRate').value) / 100 / 12;
var newRate = parseFloat(document.getElementById('newRate').value) / 100 / 12;
var oldTermMonths = parseFloat(document.getElementById('oldTerm').value) * 12;
var newTermMonths = parseFloat(document.getElementById('newTerm').value) * 12;
if (isNaN(balance) || isNaN(costs) || isNaN(oldRate) || isNaN(newRate) || isNaN(oldTermMonths) || isNaN(newTermMonths)) {
alert("Please enter valid numeric values in all fields.");
return;
}
// Monthly Payment Formula: P * [i(1+i)^n] / [(1+i)^n – 1]
var oldPayment = balance * (oldRate * Math.pow(1 + oldRate, oldTermMonths)) / (Math.pow(1 + oldRate, oldTermMonths) – 1);
var newPayment = balance * (newRate * Math.pow(1 + newRate, newTermMonths)) / (Math.pow(1 + newRate, newTermMonths) – 1);
var monthlySavings = oldPayment – newPayment;
// Total Interest Calculation
var totalOldCost = oldPayment * oldTermMonths;
var totalNewCost = (newPayment * newTermMonths) + costs;
var lifetimeSavings = totalOldCost – totalNewCost;
// Break Even
var breakEven = monthlySavings > 0 ? (costs / monthlySavings) : 0;
// Display Results
document.getElementById('refiResults').style.display = 'block';
document.getElementById('resOldPayment').innerText = '$' + oldPayment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resNewPayment').innerText = '$' + newPayment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resMonthlySavings').innerText = '$' + monthlySavings.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resTotalSavings').innerText = '$' + lifetimeSavings.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
if (monthlySavings <= 0) {
document.getElementById('resBreakEven').innerText = "Never (No monthly savings)";
} else {
document.getElementById('resBreakEven').innerText = Math.ceil(breakEven) + " months";
}
// Scroll to results on mobile
if (window.innerWidth < 600) {
document.getElementById('refiResults').scrollIntoView({ behavior: 'smooth' });
}
}