Refinancing a mortgage means replacing your existing home loan with a new one, typically with different terms and a lower interest rate. While it can save you thousands of dollars, it is not always the right financial move. Use our calculator above to determine if the numbers work for your specific situation.
Understanding the "Break-Even Point"
The break-even point is the most critical metric in refinancing. It tells you how many months you need to stay in your home to recoup the closing costs of the new loan. For example, if your new loan costs $5,000 in fees but saves you $200 per month, your break-even point is 25 months ($5,000 / $200). If you plan to sell the house in less than two years, refinancing would actually lose you money.
The 1% Rule: Fact or Fiction?
Conventional wisdom often states you should only refinance if you can lower your interest rate by at least 1%. While this is a good rule of thumb, it isn't a hard law. In today's market, even a 0.5% or 0.75% reduction can be significant on high-balance loans (e.g., $500,000+), resulting in hundreds of dollars in monthly savings.
Example Calculation: A Real-World Scenario
Imagine you have a $350,000 loan balance at 7.0% interest with 25 years remaining. Your monthly principal and interest payment is approximately $2,474.
New Rate: 5.5%
New Term: 25 Years
Closing Costs: $6,000
New Payment: $2,149
Monthly Savings: $325
Break-Even: 18.4 Months
In this scenario, you would save over $3,900 per year. After just 19 months, the $6,000 closing cost is paid for, and every month thereafter is pure profit.
When Should You Avoid Refinancing?
Near the End of Your Loan: If you only have 5-10 years left on a 30-year mortgage, starting over with a new 30-year term might lower your monthly payment but increase the total interest paid over the life of the loan.
High Closing Costs: If the fees are excessive (more than 3-5% of the loan amount), the break-even period may be too long.
Moving Soon: If you plan to relocate for a job or family within the next 24 months.
function calculateRefinance() {
var balance = parseFloat(document.getElementById('loanBalance').value);
var currentRate = parseFloat(document.getElementById('currentRate').value) / 100 / 12;
var currentTerm = parseFloat(document.getElementById('currentTerm').value) * 12;
var newRate = parseFloat(document.getElementById('newRate').value) / 100 / 12;
var newTerm = parseFloat(document.getElementById('newTerm').value) * 12;
var costs = parseFloat(document.getElementById('closingCosts').value);
if (isNaN(balance) || isNaN(currentRate) || isNaN(currentTerm) || isNaN(newRate) || isNaN(newTerm) || isNaN(costs)) {
alert("Please enter valid numbers in all fields.");
return;
}
// Formula: P [ i(1 + i)^n ] / [ (1 + i)^n – 1]
var oldPayment = balance * (currentRate * Math.pow(1 + currentRate, currentTerm)) / (Math.pow(1 + currentRate, currentTerm) – 1);
var newPayment = balance * (newRate * Math.pow(1 + newRate, newTerm)) / (Math.pow(1 + newRate, newTerm) – 1);
var monthlySavings = oldPayment – newPayment;
var breakEven = costs / monthlySavings;
var totalOldInterest = (oldPayment * currentTerm) – balance;
var totalNewInterest = (newPayment * newTerm) – balance;
var lifetimeSavings = totalOldInterest – totalNewInterest – costs;
document.getElementById('oldPayment').innerText = "$" + oldPayment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('newPayment').innerText = "$" + newPayment.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('monthlySavings').innerText = "$" + monthlySavings.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
if (monthlySavings > 0) {
document.getElementById('breakEven').innerText = breakEven.toFixed(1) + " Months";
} else {
document.getElementById('breakEven').innerText = "Never (New payment is higher)";
}
document.getElementById('lifetimeSavings').innerText = "$" + lifetimeSavings.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('results').style.display = 'block';
}