============================================================ */ (function(){ 'use strict'; function init(){ var root = document.getElementById('zssb'); if(!root) return; /* ── State ──────────────────────────────────────── */ var s1Type = 'sleeper'; // 'sleeper' or 'offduty' var s2Type = 'sleeper'; /* ── Toggle button setup ────────────────────────── */ function setupToggle(slpId, offId, callback){ var slpBtn = document.getElementById(slpId); var offBtn = document.getElementById(offId); if(!slpBtn || !offBtn) return; slpBtn.addEventListener('click', function(){ slpBtn.classList.add('active'); offBtn.classList.remove('active'); callback('sleeper'); }); offBtn.addEventListener('click', function(){ offBtn.classList.add('active'); slpBtn.classList.remove('active'); callback('offduty'); }); } setupToggle('zssb-s1-sleeper', 'zssb-s1-offduty', function(t){ s1Type = t; }); setupToggle('zssb-s2-sleeper', 'zssb-s2-offduty', function(t){ s2Type = t; }); /* ── Format decimal hours → "Xh Ym" ─────────────── */ function fmtHrs(h){ if(isNaN(h) || h < 0) return '0h 0m'; var hh = Math.floor(h); var mm = Math.round((h - hh) * 60); if(mm === 60){ hh++; mm = 0; } if(hh === 0 && mm === 0) return '0h 0m'; if(hh === 0) return mm + 'm'; if(mm === 0) return hh + 'h'; return hh + 'h ' + mm + 'm'; } /* ── Add decimal hours to a time string ─────────── */ function addHrs(timeStr, hrs){ if(!timeStr || timeStr === '') return null; var parts = timeStr.split(':'); if(parts.length < 2) return null; var totalMins = parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10) + Math.round(hrs * 60); totalMins = ((totalMins % 1440) + 1440) % 1440; var h = Math.floor(totalMins / 60); var m = totalMins % 60; return (h < 10 ? '0' : '') + h + ':' + (m < 10 ? '0' : '') + m; } /* ── Convert 24hr "HH:MM" → 12hr "H:MM AM/PM" ─── */ function to12hr(t24){ if(!t24) return null; var p = t24.split(':'); var h = parseInt(p[0], 10); var m = p[1]; var ampm = h >= 12 ? 'PM' : 'AM'; h = h % 12; if(h === 0) h = 12; return h + ':' + m + ' ' + ampm; } /* ── Warning helpers ─────────────────────────────── */ function showWarn(msg){ var w = document.getElementById('zssb-warn'); var wm = document.getElementById('zssb-wmsg'); if(w && wm){ wm.textContent = msg; w.classList.add('show'); } } function hideWarn(){ var w = document.getElementById('zssb-warn'); if(w) w.classList.remove('show'); } /* ── Status bar progress ─────────────────────────── */ function setStatus(step){ var pills = ['zssb-pill-1', 'zssb-pill-2', 'zssb-pill-3']; for(var i = 0; i < pills.length; i++){ var el = document.getElementById(pills[i]); if(el){ el.classList[i < step ? 'add' : 'remove']('active'); } } } /* ════════════════════════════════════════════════ MAIN CALCULATION — FMCSA 49 CFR §395.1(g) ════════════════════════════════════════════════ */ function calc(){ hideWarn(); setStatus(2); /* Read inputs */ var drivenBefore = parseFloat(document.getElementById('zssb-driven').value) || 0; var drivenBetween = parseFloat(document.getElementById('zssb-driven-between').value) || 0; var s1h = parseFloat(document.getElementById('zssb-s1-hrs').value) || 0; var s1m = parseFloat(document.getElementById('zssb-s1-min').value) || 0; var s2h = parseFloat(document.getElementById('zssb-s2-hrs').value) || 0; var s2m = parseFloat(document.getElementById('zssb-s2-min').value) || 0; var s1Start = document.getElementById('zssb-s1-start').value; var s2Start = document.getElementById('zssb-s2-start').value; /* Convert to decimal hours */ var split1 = s1h + (s1m / 60); var split2 = s2h + (s2m / 60); /* ── Validation ────────────────────────────────── */ if(split1 <= 0 && split2 <= 0){ showWarn('Please enter the duration for at least one split rest period.'); return; } if(split1 < 0 || split2 < 0){ showWarn('Rest period durations cannot be negative.'); return; } if(drivenBefore < 0 || drivenBetween < 0){ showWarn('Driving hours cannot be negative.'); return; } var totalDriven = drivenBefore + drivenBetween; if(totalDriven > 11){ showWarn('Total hours driven (' + totalDriven.toFixed(2) + ' hrs) exceeds the 11-hour driving limit.'); return; } /* ── FMCSA Split Sleeper Berth Logic ───────────── RULE 1: Combined rest >= 10 hours RULE 2: The longer period must be >= 7 hrs AND in sleeper berth RULE 3: The shorter period must be >= 2 hrs (sleeper or off-duty) ─────────────────────────────────────────────────── */ var totalRest = split1 + split2; var combinedOk = totalRest >= 10; var longSplit = Math.max(split1, split2); var shortSplit = Math.min(split1, split2); var longIsS1 = split1 >= split2; var longType = longIsS1 ? s1Type : s2Type; /* Long split: must be >= 7 hrs AND sleeper berth */ var longOk = (longSplit >= 7) && (longType === 'sleeper'); /* Short split: must be >= 2 hrs (any type) */ var shortOk = (shortSplit >= 2); /* Single-split detection (only one period entered) */ var oneSplit = (split1 > 0 && split2 === 0) || (split1 === 0 && split2 > 0); var isCompliant = false; var reason = ''; if(oneSplit){ isCompliant = false; reason = 'Only one split period entered. Please enter both Split 1 and Split 2 durations to check full FMCSA compliance.'; } else { var failReasons = []; if(!longOk){ if(longSplit < 7){ failReasons.push('Longer split (' + fmtHrs(longSplit) + ') is under the required 7-hour minimum.'); } else { failReasons.push('Longer split (' + fmtHrs(longSplit) + ') must be in the sleeper berth, not off-duty.'); } } if(!shortOk){ failReasons.push('Shorter split (' + fmtHrs(shortSplit) + ') is under the required 2-hour minimum.'); } if(!combinedOk){ failReasons.push('Combined rest (' + fmtHrs(totalRest) + ') is under the 10-hour minimum required.'); } isCompliant = longOk && shortOk && combinedOk; if(isCompliant){ reason = 'Both splits meet FMCSA requirements. Your 14-hour clock is paused during both rest periods and restarts at the end of Split 2.'; } else { reason = failReasons.join(' '); } } /* ── Remaining drive time ───────────────────────── */ var driveRemaining = Math.max(0, 11 - totalDriven); /* ── Timeline data (if start times provided) ──── */ var timelineData = null; if(s1Start && s1Start !== ''){ var s1End = addHrs(s1Start, split1); var midDrive = s2Start && s2Start !== '' ? s2Start : (s1End ? addHrs(s1End, drivenBetween) : null); var s2End = midDrive ? addHrs(midDrive, split2) : null; timelineData = { s1Start: to12hr(s1Start), s1End: to12hr(s1End), s2Start: s2Start && s2Start !== '' ? to12hr(s2Start) : (midDrive ? to12hr(midDrive) : null), s2End: to12hr(s2End), resumeTime: s2End ? to12hr(s2End) : null }; } /* ── Render results ──────────────────────────────── */ renderResults(isCompliant, reason, { split1: split1, split2: split2, totalRest: totalRest, longSplit: longSplit, shortSplit: shortSplit, longOk: longOk, shortOk: shortOk, combinedOk: combinedOk, longType: longType, drivenBefore: drivenBefore, drivenBetween: drivenBetween, totalDriven: totalDriven, driveRemaining:driveRemaining, s1Type: s1Type, s2Type: s2Type, oneSplit: oneSplit }, timelineData); setStatus(3); } /* ════════════════════════════════════════════════ RENDER RESULTS ════════════════════════════════════════════════ */ function renderResults(isCompliant, reason, d, tl){ /* Element refs */ var resEl = document.getElementById('zssb-res'); var banner = document.getElementById('zssb-banner'); var bannerStatus= document.getElementById('zssb-banner-status'); var bannerReason= document.getElementById('zssb-banner-reason'); var bannerSvg = document.getElementById('zssb-banner-svg'); var cardsEl = document.getElementById('zssb-cards'); var breakdownEl = document.getElementById('zssb-breakdown'); var timelineEl = document.getElementById('zssb-timeline'); var tlWrap = document.getElementById('zssb-timeline-wrap'); /* ── Compliance Banner ──────────────────────────── */ if(d.oneSplit){ banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = 'Incomplete — Enter Both Splits'; bannerSvg.innerHTML = ''; } else if(isCompliant){ banner.className = 'compliance-banner compliant'; bannerStatus.textContent = '✅ FMCSA Compliant — Valid Split'; bannerSvg.innerHTML = ''; } else { banner.className = 'compliance-banner non-compliant'; bannerStatus.textContent = '❌ Non-Compliant — Invalid Split'; bannerSvg.innerHTML = ''; } bannerReason.textContent = reason; /* ── Summary Cards ──────────────────────────────── */ var cards = []; if(!d.oneSplit){ cards.push({ v: fmtHrs(d.split1), u: d.s1Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 1 Duration', cls: d.s1Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.split2), u: d.s2Type === 'sleeper' ? 'SLEEPER' : 'OFF-DUTY', n: 'Split 2 Duration', cls: d.s2Type === 'sleeper' ? 'blue' : 'orange' }); cards.push({ v: fmtHrs(d.totalRest), u: 'TOTAL REST', n: 'Combined Off-Duty', cls: d.combinedOk ? 'green' : 'red' }); cards.push({ v: fmtHrs(d.driveRemaining), u: 'REMAINING', n: 'Drive Time Left', cls: d.driveRemaining > 4 ? 'green' : (d.driveRemaining > 2 ? 'orange' : 'red') }); } cardsEl.innerHTML = cards.map(function(c){ return '
' + '
' + c.v + '
' + '
' + c.u + '
' + '
' + c.n + '
' + '
'; }).join(''); /* ── Breakdown Table ────────────────────────────── */ var rows = []; if(!d.oneSplit){ rows.push({lbl: 'Split 1 (' + (d.s1Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split1), cls: ''}); rows.push({lbl: 'Split 2 (' + (d.s2Type === 'sleeper' ? 'Sleeper Berth' : 'Off-Duty') + ')', val: fmtHrs(d.split2), cls: ''}); rows.push({lbl: 'Combined Rest Total', val: fmtHrs(d.totalRest) + (d.totalRest >= 10 ? ' ✓' : ' ✗ (Need ≥10h)'), cls: d.combinedOk ? 'ok' : 'fail'}); rows.push({lbl: 'Longer Split ≥7 hrs in Sleeper Berth', val: d.longOk ? '✓ Pass' : '✗ Fail', cls: d.longOk ? 'ok' : 'fail'}); rows.push({lbl: 'Shorter Split ≥2 hrs (any type)', val: d.shortOk ? '✓ Pass' : '✗ Fail', cls: d.shortOk ? 'ok' : 'fail'}); rows.push({lbl: 'Hours Driven Before Split 1', val: fmtHrs(d.drivenBefore), cls: 'info'}); rows.push({lbl: 'Hours Driven Between Splits', val: fmtHrs(d.drivenBetween), cls: 'info'}); rows.push({lbl: 'Total Hours Driven', val: fmtHrs(d.totalDriven) + ' / 11 hrs max', cls: d.totalDriven < 11 ? 'ok' : 'fail'}); rows.push({lbl: 'Drive Time Remaining After Splits', val: fmtHrs(d.driveRemaining), cls: d.driveRemaining > 0 ? 'ok' : 'fail'}); rows.push({lbl: '14-Hour Clock Paused During Splits', val: isCompliant ? 'Yes — Both periods excluded' : 'Not applicable (fix issues above)', cls: isCompliant ? 'ok' : 'fail'}); } breakdownEl.innerHTML = rows.map(function(r){ return '
' + '' + r.lbl + '' + '' + r.val + '' + '
'; }).join(''); /* ── Timeline ───────────────────────────────────── */ if(!d.oneSplit){ tlWrap.style.display = 'block'; var items = []; items.push({ dot: 'drive', label: 'Started Driving', desc: 'Drove ' + fmtHrs(d.drivenBefore) + ' before first rest period.' }); items.push({ dot: 'sleep', label: 'Split 1 Begins' + (tl && tl.s1Start ? ' at ' + tl.s1Start : ''), desc: fmtHrs(d.split1) + ' ' + (d.s1Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s1End ? ' → Ends: ' + tl.s1End : '') }); if(d.drivenBetween > 0){ items.push({ dot: 'drive', label: 'Resumed Driving Between Splits', desc: 'Drove ' + fmtHrs(d.drivenBetween) + ' between the two rest periods.' }); } items.push({ dot: 'sleep', label: 'Split 2 Begins' + (tl && tl.s2Start ? ' at ' + tl.s2Start : ''), desc: fmtHrs(d.split2) + ' ' + (d.s2Type === 'sleeper' ? 'in Sleeper Berth' : 'Off-Duty') + (tl && tl.s2End ? ' → Ends: ' + tl.s2End : '') }); if(isCompliant){ items.push({ dot: 'done', label: '14-Hour Clock Restarts' + (tl && tl.resumeTime ? ' at ' + tl.resumeTime : ''), desc: 'Both splits complete. ' + fmtHrs(d.driveRemaining) + ' drive time remaining.' }); } else { items.push({ dot: 'off', label: 'Non-Compliant — Cannot Resume', desc: 'Fix the split issues above before resuming driving.' }); } timelineEl.innerHTML = items.map(function(it){ return '
' + '
' + '
' + '
' + it.label + '
' + '
' + it.desc + '
' + '
'; }).join(''); } else { tlWrap.style.display = 'none'; } /* ── Show results panel ─────────────────────────── */ resEl.classList.add('show'); setTimeout(function(){ resEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }, 100); } /* ════════════════════════════════════════════════ RESET ════════════════════════════════════════════════ */ function resetAll(){ /* Clear number inputs */ var numIds = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numIds.forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Clear time inputs */ ['zssb-s1-start', 'zssb-s2-start'].forEach(function(id){ var el = document.getElementById(id); if(el) el.value = ''; }); /* Reset toggle states */ s1Type = 'sleeper'; s2Type = 'sleeper'; ['zssb-s1-sleeper', 'zssb-s2-sleeper'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.add('active'); }); ['zssb-s1-offduty', 'zssb-s2-offduty'].forEach(function(id){ var el = document.getElementById(id); if(el) el.classList.remove('active'); }); /* Hide warning and results */ hideWarn(); var resEl = document.getElementById('zssb-res'); if(resEl) resEl.classList.remove('show'); setStatus(1); } /* ── Event Listeners ──────────────────────────────── */ var calcBtn = document.getElementById('zssb-btn'); if(calcBtn) calcBtn.addEventListener('click', calc); var rstBtn = document.getElementById('zssb-reset'); if(rstBtn) rstBtn.addEventListener('click', resetAll); /* Enter key triggers calculation */ var numFields = ['zssb-driven', 'zssb-driven-between', 'zssb-s1-hrs', 'zssb-s1-min', 'zssb-s2-hrs', 'zssb-s2-min']; numFields.forEach(function(id){ var el = document.getElementById(id); if(el) el.addEventListener('keydown', function(e){ if(e.key === 'Enter') calc(); }); }); } /* end init() */ /* ── Safe DOM-ready execution ───────────────────────── */ if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); } else { init(); } })();
CD Yield Calculator
Calculate your Certificate of Deposit interest & APY instantly — for any term, rate & compounding schedule.
CD Details
Principal Deposit
Annual Interest Rate
Enter the % rate (e.g. 5 for 5%)
CD Term
Compounding Frequency
Additional Monthly Deposits
/mo
Optional recurring deposit each month
Your Results
Total Interest Earned
at maturity
APY
▸ Full Breakdown
Formulas & Notes
  • Compound Interest: A = P × (1 + r/n)^(n×t)
  • Simple Interest: A = P × (1 + r × t)
  • APY from APR: APY = (1 + r/n)^n − 1
  • Variables: P = Principal  |  r = Annual rate (decimal)  |  n = Compounding periods/year  |  t = Term in years
  • Enter APY in the rate field if your bank already shows APY — the tool will use it directly.
  • Early withdrawal penalties are not modeled. Results assume full-term hold.
  • All results are pre-tax. CD interest is taxable as ordinary income.
  • Source: FDIC.gov, CFPB Consumer Finance, U.S. SEC Investor.gov

CD Yield Calculator: Find Your Certificate of Deposit Earnings Instantly

A CD yield calculator takes the guesswork out of saving — enter your deposit amount, interest rate, and term, and you'll instantly see exactly how much your money will grow. Whether you're comparing bank offers or planning your next savings milestone, this tool is built for anyone who wants clear, accurate numbers before committing their cash.


What This Calculator Tells You

Once you input your details, the Zo Calculator CD yield tool gives you:

  • Total interest earned over the full CD term
  • Final maturity value (your original deposit + interest)
  • Annual Percentage Yield (APY) — the true effective annual return
  • Simple vs. compound interest breakdown so you see how compounding frequency changes your outcome
  • Monthly and annual growth snapshots for multi-year CDs
  • Yield comparison across different compounding schedules (daily, monthly, quarterly, annually)

How the Calculator Works (The Formula & Logic)

Understanding how to calculate CD yield comes down to one core distinction: are you dealing with simple interest or compound interest?

For Simple Interest CDs:

Interest = Principal × Annual Rate × Term (in years)

For Compound Interest CDs (the industry standard):

A = P × (1 + r/n)^(n×t)

Where:

  • A = Final amount at maturity
  • P = Principal (your initial deposit)
  • r = Annual interest rate (as a decimal, e.g., 4.5% = 0.045)
  • n = Number of compounding periods per year (12 for monthly, 4 for quarterly, 365 for daily)
  • t = Term in years

To calculate CD yield (APY) from a nominal rate:

APY = (1 + r/n)^n − 1

This APY formula is what banks are legally required to disclose under the Truth in Savings Act, making it the most reliable figure when comparing CDs across institutions.


Standard CD Yield Ratings & Classifications

APY RangeMarket ClassificationTypical CD TermSaver Verdict
0.01% – 0.50%Below AverageSavings account / demand depositAvoid for growth
0.51% – 2.00%Average3–6 month short-termAcceptable for liquidity
2.01% – 4.00%Competitive12-month CDGood for cautious savers
4.01% – 5.00%High-Yield12–24 month CDExcellent return
5.01%+Premium / PromotionalVaries by institutionTarget these rates

Note: Rates fluctuate with Federal Reserve monetary policy. Always verify current rates directly with your bank or credit union.


Step-by-Step Practical Example

Let's walk through exactly how to calculate a CD yield manually so you can verify any tool's output.

Scenario: You deposit $10,000 into a 12-month CD at a 5.00% annual rate, compounded monthly.

Step 1 — Identify your variables:

  • P = $10,000
  • r = 0.05 (5.00% ÷ 100)
  • n = 12 (monthly compounding)
  • t = 1 year

Step 2 — Apply the compound interest formula:

A = 10,000 × (1 + 0.05/12)^(12×1)
A = 10,000 × (1.004167)^12
A = 10,000 × 1.05116
A = $10,511.62

Step 3 — Calculate your yield and earnings:

  • Total Interest Earned: $10,511.62 − $10,000 = $511.62
  • APY: (1 + 0.05/12)^12 − 1 = 5.116%

Your CD earned $511.62 — slightly more than a simple-interest calculation would show, thanks to the power of monthly compounding.


How to Use Zo Calculator's CD Yield Tool

Getting your results on ZoCalculator.com takes under 30 seconds:

  1. Enter your principal deposit — the exact dollar amount you plan to invest in the CD.
  2. Input the annual interest rate (APR) — find this on your bank's offer sheet or website. Do not confuse this with APY.
  3. Select your CD term — choose months or years depending on how the bank lists the product.
  4. Choose compounding frequency — daily, monthly, quarterly, or annually. When unsure, select monthly, as it's the most common.
  5. Hit "Calculate" — your total interest, maturity value, and APY appear instantly.
  6. Compare scenarios — adjust the rate or term to run side-by-side comparisons before making a decision.

Practical Applications and Real-World Uses

  • Personal retirement planning: Retirees and near-retirees use CD yield calculations to build low-risk income ladders with predictable, guaranteed returns.
  • Bank offer comparisons: Savers use the APY output to objectively compare promotional CD rates from different banks and credit unions side-by-side.
  • Business cash management: Businesses holding reserve funds use the tool to determine if short-term CDs outperform business savings accounts for idle capital.
  • Financial advisors & planners: Professionals use it to model conservative fixed-income allocations within a client's broader portfolio strategy.
  • Student financial literacy: Educators and students learning how to calculate CD yield use the step-by-step output to understand real-world compounding mechanics.
  • Tax planning: Since CD interest is taxable as ordinary income, knowing your exact yield figure in advance helps account holders estimate tax liability.

Important Notes & Technical Limitations

  1. No early withdrawal penalties modeled: This calculator assumes you hold the CD to full maturity. Withdrawing early typically forfeits a portion of earned interest; the actual penalty varies by institution.
  2. Rates are user-entered, not live: Zo Calculator does not connect to live bank feeds. You must manually enter the rate from your bank's current offer.
  3. FDIC/NCUA insurance not factored in: While CDs at FDIC-insured banks are insured up to $250,000 per depositor, the calculator makes no assessment of institutional risk.
  4. Tax impact excluded: The yield figures shown are pre-tax. CD interest is subject to federal (and often state) income tax in the year it is credited, which will reduce your real net return.

Helpful References & Sources

  • FDIC.gov — Official guidance on deposit insurance, CD regulations, and consumer rights for certificate of deposit holders.
  • Consumerfinance.gov (CFPB) — Plain-language explanations of APY, Truth in Savings disclosures, and how to compare bank deposit products.
  • Investor.gov (U.S. SEC) — Compound interest calculator references and educational materials on how fixed-income instruments grow over time.

🙋 Frequently Asked Questions (FAQs)

What is a CD yield calculator and how does it work?

A CD yield calculator is a digital tool that computes how much interest you will earn on a certificate of deposit based on your principal, interest rate, compounding frequency, and term length. It applies the standard compound interest formula — A = P(1 + r/n)^(nt) — to produce your maturity value and effective APY. This removes the need for manual calculations and eliminates rounding errors.

How do I calculate CD yield manually?

To calculate CD yield manually, use the formula: APY = (1 + r/n)^n − 1, where r is the nominal annual rate as a decimal and n is the number of compounding periods per year. For example, a 5% rate compounded monthly gives an APY of approximately 5.116%. This is the figure that reflects your true annual earnings, accounting for compounding.

What is the difference between APR and APY on a CD?

APR (Annual Percentage Rate) is the stated nominal interest rate on a CD before compounding is applied. APY (Annual Percentage Yield) reflects the actual return after compounding is factored in, so it is always equal to or higher than the APR. When comparing CDs, always use the APY figure — it is the legally standardized metric disclosed under the Truth in Savings Act.

How to calculate a CD yield for a short-term CD under 12 months?

For a CD with a term shorter than one year, adjust the "t" variable in the formula to a fraction. A 6-month CD, for example, uses t = 0.5 (half a year). So a $5,000 deposit at 4.80% compounded monthly for 6 months would be: A = 5,000 × (1 + 0.048/12)^(12×0.5) = roughly $5,120.48, earning $120.48 in interest.

Are CD yields guaranteed?

Yes — certificates of deposit are fixed-rate instruments, meaning the yield is locked in at the time of account opening and will not change for the life of the CD term. This is one of the primary reasons savers choose CDs over high-yield savings accounts, which carry variable rates that can drop at any time.

Does compounding frequency really make a difference on CD yield?

Yes, though the impact depends on your principal and rate. Daily compounding produces slightly more than monthly compounding, which produces more than annual compounding. On a $50,000 CD at 5% for 2 years, the difference between daily and annual compounding is roughly $12–$15 — modest, but worth factoring in when choosing between otherwise identical offers.

Is CD interest taxable income?

Yes. The IRS treats CD interest as ordinary income, taxable in the year it is credited to your account — even if you do not withdraw it. Your bank will issue a Form 1099-INT at year-end. For multi-year CDs that compound annually, you will owe taxes on the credited interest each year, not just at maturity.

What is a good CD yield rate right now?

CD yield rates fluctuate with Federal Reserve policy decisions. In general, rates above 4.00% APY are considered competitive, while rates at or above 5.00% are considered premium or promotional. Online banks and credit unions often offer higher rates than traditional brick-and-mortar institutions due to lower overhead costs.

Can I use this calculator to compare multiple CD offers?

Absolutely. Simply run the Zo Calculator CD tool once for each offer by plugging in the different rates and compounding frequencies, then compare the APY and maturity value results side-by-side. This is the most objective way to identify the highest-yielding option for your savings goals.

What happens to my CD yield if I withdraw early?

If you withdraw before maturity, most banks apply an early withdrawal penalty — typically forfeiting 90 days to 12 months of interest depending on the CD term. This can significantly reduce or even eliminate your effective yield. This calculator models full-term scenarios only, so for early withdrawal planning, contact your bank directly for penalty terms.


Explore Related Calculators on Zo Calculator