function LoanCalculator() { const [mode, setMode] = useState('simple'); const [loanAmount, setLoanAmount] = useState(''); const [interestRate, setInterestRate] = useState(''); const [tenure, setTenure] = useState(''); const [periods, setPeriods] = useState([{ year: 1, rate: '', description: 'Year 1' }]); const [result, setResult] = useState(null); const calculateSimple = () => { if (loanAmount && interestRate && tenure) { const principal = parseFloat(loanAmount); const annualRate = parseFloat(interestRate); const months = parseFloat(tenure) * 12; const monthlyRate = annualRate / (12 * 100); const emi = (principal * monthlyRate * Math.pow(1 + monthlyRate, months)) / (Math.pow(1 + monthlyRate, months) - 1); const totalAmount = emi * months; const totalInterest = totalAmount - principal; setResult({ type: 'simple', emi, totalAmount, totalInterest, principal, rate: annualRate, tenure: parseFloat(tenure) }); } }; const calculateAdvanced = () => { const principal = parseFloat(loanAmount); if (!principal) return; let remainingPrincipal = principal; let totalInterestPaid = 0; let breakdown = []; let currentYear = 1; periods.forEach((period) => { const rate = parseFloat(period.rate) || 0; const monthlyRate = rate / (12 * 100); const months = 12; if (remainingPrincipal > 0) { // Calculate EMI for this period const yearsRemaining = periods.length - (currentYear - 1); const monthsRemaining = yearsRemaining * 12; const emi = (remainingPrincipal * monthlyRate * Math.pow(1 + monthlyRate, monthsRemaining)) / (Math.pow(1 + monthlyRate, monthsRemaining) - 1); let yearInterest = 0; let yearPrincipal = 0; let startingBalance = remainingPrincipal; // Calculate for 12 months for (let month = 0; month < months && remainingPrincipal > 0; month++) { const monthInterest = remainingPrincipal * monthlyRate; const monthPrincipal = emi - monthInterest; yearInterest += monthInterest; yearPrincipal += monthPrincipal; remainingPrincipal -= monthPrincipal; } totalInterestPaid += yearInterest; breakdown.push({ year: currentYear, rate: rate, emi: emi, startingBalance: startingBalance, principalPaid: yearPrincipal, interestPaid: yearInterest, endingBalance: Math.max(0, remainingPrincipal) }); currentYear++; } }); setResult({ type: 'advanced', principal: principal, totalInterest: totalInterestPaid, totalAmount: principal + totalInterestPaid, breakdown: breakdown }); }; const addPeriod = () => setPeriods([...periods, { year: periods.length + 1, rate: '', description: `Year ${periods.length + 1}` }]); const removePeriod = (index) => { if (periods.length > 1) { const newPeriods = periods.filter((_, i) => i !== index).map((p, i) => ({ ...p, year: i + 1, description: `Year ${i + 1}` })); setPeriods(newPeriods); } }; const updatePeriod = (index, field, value) => { const newPeriods = [...periods]; newPeriods[index][field] = value; setPeriods(newPeriods); }; return (

🏦 Advanced Loan EMI Calculator

Calculate EMI with variable interest rates

setLoanAmount(e.target.value)} placeholder="1000000" />
{mode === 'simple' ? (
setInterestRate(e.target.value)} placeholder="9.5" step="0.1" />
setTenure(e.target.value)} placeholder="20" />
) : (
How it works: Set different interest rates for each year. EMI is recalculated each year based on remaining principal and new rate.
{periods.map((period, index) => (
Year {period.year} {periods.length > 1 && ( )}
updatePeriod(index, 'rate', e.target.value)} placeholder="9.5" step="0.1" />
))}
)} {result && result.type === 'simple' && (
Monthly EMI
₹{result.emi.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Principal
₹{result.principal.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Total Interest
₹{result.totalInterest.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Total Amount Payable
₹{result.totalAmount.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
{result.rate}% p.a. for {result.tenure} years ({result.tenure * 12} months)
)} {result && result.type === 'advanced' && (
Principal Amount
₹{result.principal.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Total Interest Paid
₹{result.totalInterest.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Total Amount Payable
₹{result.totalAmount.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Year-by-Year Breakdown
{result.breakdown.map((item, index) => (
Year {item.year} @ {item.rate}%
Monthly EMI: ₹{item.emi.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Opening Balance: ₹{item.startingBalance.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Principal Paid: ₹{item.principalPaid.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Interest Paid: ₹{item.interestPaid.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
Closing Balance: ₹{item.endingBalance.toLocaleString('en-IN', { maximumFractionDigits: 0 })}
))}
)}
); } // Export to global registry window.LoanCalculator = LoanCalculator;