January
February
March
April
May
June
July
August
September
October
November
December
Purchase Price:
Current Estimated Value:
Interest Earned to Date:
Total Increase:
Status:
How the Series EE Bond Calculator Works
Series EE Savings Bonds are non-marketable Treasury securities. Their value depends heavily on when they were issued. This calculator estimates the growth of your bond based on the specific rules governing EE bonds issued since May 2005.
Key Rules for Series EE Bonds:
Purchase Price: Bonds issued after May 2005 are purchased at face value (e.g., a $100 bond costs $100). Bonds issued before May 2005 were purchased at half their face value.
The 20-Year Double: The Treasury guarantees that an EE bond will double in value after 20 years. If the fixed interest rate doesn't get it there, the Treasury makes a one-time adjustment to fulfill this promise.
Interest Accrual: Interest is added to the bond monthly and compounded semiannually.
Holding Period: You must hold an EE bond for at least one year. If you cash it before five years, you forfeit the last three months of interest.
Example Calculation
Imagine you purchased a $1,000 Series EE Bond in January 2010.
Initial Investment: $1,000.00
Time Elapsed: Approx 14 years.
Guaranteed Value: After 20 years (January 2030), the Treasury guarantees this bond will be worth $2,000.00, regardless of the fixed rate.
Current Value: The value today consists of the $1,000 principal plus the compounded fixed interest rate assigned at the time of purchase.
Taxation of EE Bonds
Interest earned on Series EE bonds is subject to Federal income tax but is exempt from State and Local income taxes. You can choose to report the interest annually or defer reporting until you cash the bond or it reaches final maturity at 30 years.
function calculateEEBond() {
var denomination = parseFloat(document.getElementById('bondDenomination').value);
var issueMonth = parseInt(document.getElementById('issueMonth').value);
var issueYear = parseInt(document.getElementById('issueYear').value);
var rate = parseFloat(document.getElementById('currentRate').value) / 100;
if (isNaN(denomination) || isNaN(issueYear) || isNaN(rate)) {
alert("Please enter valid numbers for all fields.");
return;
}
var now = new Date();
var currentMonth = now.getMonth();
var currentYear = now.getFullYear();
// Calculate total months held
var totalMonths = (currentYear – issueYear) * 12 + (currentMonth – issueMonth);
if (totalMonths < 0) {
alert("Issue date cannot be in the future.");
return;
}
// Pre-May 2005 bonds were half face value. Post-May 2005 are full face value.
var purchasePrice = denomination;
if (issueYear < 2005 || (issueYear === 2005 && issueMonth = 240) {
var doubledValue = purchasePrice * 2;
if (currentValue < doubledValue) {
// Calculation for post-20 year growth using the fixed rate starting from the doubled value
var monthsAfterDouble = totalMonths – 240;
var yearsAfterDouble = monthsAfterDouble / 12;
currentValue = doubledValue * Math.pow((1 + rate / 2), (2 * yearsAfterDouble));
}
}
// Penalty check: Cash before 5 years = lose 3 months interest
var displayValue = currentValue;
var status = "Earning Interest";
if (totalMonths < 12) {
status = "Cannot cash (under 1 year)";
} else if (totalMonths = 360) {
status = "Matured (No longer earning interest)";
// Cap at 30 years
var maxYears = 30;
var maxVal = purchasePrice * Math.pow((1 + rate / 2), (2 * maxYears));
if (maxYears >= 20) {
var dv = purchasePrice * 2;
maxVal = dv * Math.pow((1 + rate / 2), (2 * (maxYears – 20)));
}
if (currentValue > maxVal) displayValue = maxVal;
}
var interestEarned = displayValue – purchasePrice;
var totalIncrease = (interestEarned / purchasePrice) * 100;
document.getElementById('resPurchasePrice').innerText = "$" + purchasePrice.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resCurrentValue').innerText = "$" + displayValue.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resInterest').innerText = "$" + interestEarned.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('resIncrease').innerText = totalIncrease.toFixed(2) + "%";
document.getElementById('resStatus').innerText = status;
document.getElementById('bondResult').style.display = 'block';
}