============================================================ */ (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(); } })();
Iron Deficit Calculator
Calculate total iron requirement using the Ganzoni Formula — clinical-grade accuracy for worldwide use.
Patient Inputs
Body Weight
Current Hemoglobin (Actual Hb)
Target Hemoglobin
Iron Stores Replenishment
Patient Type
Show Results
!
Please enter valid values for all required fields.
Results — Ganzoni Formula
Formula, References & Clinical Notes
  • Formula: Iron Deficit (mg) = Weight (kg) × (Target Hb − Actual Hb) × 2.4 + Iron Stores (mg)
  • Constant 2.4 = Blood Volume (70 mL/kg) × Hb iron content (0.34%) × unit conversion
  • Iron Stores: 500 mg for adults ≥35 kg  |  250 mg for children <35 kg
  • WHO Normal Hb: Males ≥13 g/dL  |  Non-pregnant Females ≥12 g/dL  |  Pregnant ≥11 g/dL
  • Source: Ganzoni AM. Intravenous iron-dextran. Schweiz Med Wochenschr. 1970.
  • Reference: WHO. Haemoglobin concentrations for the diagnosis of anaemia. Geneva: WHO; 2011.
  • This tool is for educational and reference use only. Not a substitute for clinical judgment.

Iron Deficit Calculator: Find Your Iron Need Instantly

The iron deficit calculator helps you determine exactly how much elemental iron your body is missing based on your current hemoglobin levels, target hemoglobin, and body weight. Whether you are a clinician guiding iron therapy or a patient trying to understand your iron deficiency anemia, this tool gives you a fast, reliable number without manual math.


What This Calculator Tells You

Using this tool, you can instantly find:

  • Total iron deficit in milligrams (mg) needed to restore healthy hemoglobin levels
  • Your hemoglobin gap — the difference between your current and target Hb values
  • Weight-adjusted iron requirement so the result is personalized to your body
  • Blood volume estimate used as part of the Ganzoni formula
  • Replacement iron dose to guide supplementation or IV iron therapy planning

How the Calculator Works (The Formula & Logic)

Iron deficit calculation is based on the internationally recognized Ganzoni Formula, which is the clinical standard for calculating iron deficit in patients with iron deficiency anemia.

The formula written in plain language is:

Total Iron Deficit (mg) = Body Weight (kg) × (Target Hb − Actual Hb) (g/dL) × 2.4 + Iron Stores (mg)

Here is what each part means:

  • Body Weight (kg) — your current weight in kilograms
  • Target Hb (g/dL) — the normal hemoglobin level you are aiming for (typically 15 g/dL for adults)
  • Actual Hb (g/dL) — your current measured hemoglobin from a blood test
  • 2.4 — a conversion constant derived from blood volume and hemoglobin iron content
  • Iron Stores (mg) — a fixed value of 500 mg added for adults to replenish depleted body stores (250 mg for children under 35 kg)

So a simplified version looks like:

Iron Deficit = Weight × (Target Hb − Current Hb) × 2.4 + 500

This is the same logic used in clinical settings when calculating iron deficit before prescribing IV iron infusions such as Ferric Carboxymaltose or Iron Sucrose.


Standard Classifications & Reference Ranges

Understanding where your hemoglobin falls helps contextualize your iron deficit calculation result. Below is a general reference table based on WHO guidelines for adults.

Hemoglobin Level (g/dL)ClassificationTypical Iron Deficit Range
≥ 12.0 (women) / ≥ 13.0 (men)Normal0 mg (no deficit)
10.0 – 11.9Mild Anemia300 – 700 mg
8.0 – 9.9Moderate Anemia700 – 1,200 mg
6.0 – 7.9Severe Anemia1,200 – 2,000 mg
< 6.0Very Severe Anemia2,000 mg+

Note: These are general estimates. Actual values depend on body weight and target hemoglobin set by your physician.


Step-by-Step Practical Example

Let's walk through a real example to show exactly how iron deficit calculation works manually.

Patient Profile:

  • Female patient, Age 32
  • Body Weight: 60 kg
  • Current (Actual) Hemoglobin: 8.5 g/dL
  • Target Hemoglobin: 15 g/dL
  • Iron Stores to Replenish: 500 mg (standard for adults over 35 kg)

Step 1 — Find the Hemoglobin Gap:
Target Hb − Actual Hb = 15 − 8.5 = 6.5 g/dL

Step 2 — Apply the Ganzoni Formula:
60 × 6.5 × 2.4 = 60 × 15.6 = 936 mg

Step 3 — Add Iron Stores:
936 + 500 = 1,436 mg total iron deficit

This patient needs approximately 1,436 mg of elemental iron to reach her target hemoglobin and restore iron stores. A clinician would use this number to determine the correct dose and number of IV iron infusions required.


How to Use Zo Calculator's Iron Deficit Tool

Using the iron deficit calculator on ZoCalculator.com is quick and straightforward. Here is exactly what to do:

  1. Enter your body weight in kilograms (kg). If you know your weight in pounds, divide it by 2.205 to convert.
  2. Enter your current hemoglobin (Actual Hb) from your most recent blood test report, in g/dL.
  3. Enter your target hemoglobin — your doctor may specify this, or you can use the default value of 15 g/dL for adults.
  4. Select your iron stores value — the calculator uses 500 mg for adults (≥35 kg) and 250 mg for children by default.
  5. Click Calculate — your total iron deficit in mg appears instantly.
  6. Read your result — the output tells you the total elemental iron needed. Share this number with your healthcare provider to discuss treatment options.

Practical Applications and Real-World Uses

Calculating iron deficit has genuine clinical and personal value across several scenarios:

  • Anemia treatment planning — Doctors and hematologists use the Ganzoni formula to prescribe the correct total dose of IV iron infusions for patients who cannot tolerate oral supplements.
  • Pregnancy and postpartum care — Pregnant women are at high risk of iron deficiency; midwives and OB-GYNs use iron deficit calculations to determine safe supplementation levels.
  • Pre-surgical assessment — Surgeons and anesthesiologists calculate iron deficit before elective procedures to correct anemia and reduce the need for blood transfusions.
  • Chronic kidney disease (CKD) management — Nephrologists regularly monitor and calculate iron needs in dialysis patients receiving erythropoiesis-stimulating agents (ESAs).
  • Sports medicine and athletic performance — Coaches and sports physicians track hemoglobin and iron status in endurance athletes where iron deficiency can significantly impair oxygen-carrying capacity.
  • Patient self-education — People newly diagnosed with iron deficiency anemia can use this tool to better understand their condition before their next clinical appointment.

Important Notes & Technical Limitations

This calculator is a reference and educational tool. Please keep the following in mind:

  1. Not a substitute for medical advice — The results of this iron deficit calculator are for informational purposes only. Always consult a licensed physician, hematologist, or registered dietitian before beginning any iron therapy.
  2. Ganzoni formula limitations — Studies have shown the Ganzoni formula can underestimate iron needs in some patient populations, particularly those with severe anemia. Some clinicians prefer fixed-dose IV iron protocols as a result.
  3. Hemoglobin targets may vary — The target Hb used in calculation should be set by your doctor based on your specific condition, age, sex, and altitude. The general default of 15 g/dL may not apply to all patients.
  4. This tool calculates elemental iron only — Different iron preparations (Iron Sucrose, Ferric Carboxymaltose, Ferrous Sulfate) contain different percentages of elemental iron. Your pharmacist or physician will convert the elemental iron dose into the correct product dose for you.

Helpful References & Sources

  • World Health Organization (WHO) — Haemoglobin concentrations for the diagnosis of anaemia: who.int
  • National Institutes of Health – Office of Dietary Supplements — Iron fact sheet for health professionals: ods.od.nih.gov
  • Wikipedia – Ganzoni Equation — Background on the formula and its clinical use: wikipedia.org

🙋 Frequently Asked Questions (FAQs)

What is an iron deficit calculator used for?

An iron deficit calculator is used to estimate the total amount of elemental iron a person needs to correct iron deficiency anemia. It is based on the Ganzoni formula and takes into account body weight, current hemoglobin, target hemoglobin, and iron store replenishment. Clinicians use it to plan IV iron therapy, while patients use it to better understand their diagnosis.

How do I calculate iron deficit manually?

To calculate iron deficit manually, use the Ganzoni formula: Total Iron Deficit (mg) = Body Weight (kg) × (Target Hb − Actual Hb) × 2.4 + 500. Subtract your current hemoglobin from your target hemoglobin, multiply by your weight in kg and by 2.4, then add 500 mg for adult iron stores. The result is your total iron requirement in milligrams.

What is a normal iron deficit value?

A person with a normal hemoglobin level (≥12 g/dL in women, ≥13 g/dL in men) has an iron deficit of zero — meaning no treatment is needed. Any hemoglobin value below normal will produce a positive iron deficit result when you run the calculation, with higher deficits corresponding to more severe levels of anemia.

What is the Ganzoni formula and why does the calculator use it?

The Ganzoni formula is the most widely accepted clinical method for calculating iron deficit in patients with iron deficiency anemia. It was developed to account for both the hemoglobin correction dose and the need to replenish empty body iron stores. Our calculator uses this formula because it is the standard referenced in medical literature and adopted by iron infusion product guidelines worldwide.

Is 500 mg always used for iron stores in the calculation?

For most adults weighing 35 kg or more, 500 mg is the standard value used to replenish iron stores in the Ganzoni formula. For children or patients weighing less than 35 kg, the iron store value is reduced to 250 mg. Your physician may adjust this figure based on your specific clinical situation or local treatment protocols.

Can I use this calculator to determine my oral iron supplement dose?

This calculator gives you the total elemental iron deficit, which is most directly applicable to IV iron therapy planning. For oral supplements, the daily dose and duration of supplementation are determined differently — typically by a doctor prescribing 100–200 mg of elemental iron per day and monitoring hemoglobin response every 4 weeks. Consult your physician before starting oral iron based on this result.

How accurate is iron deficit calculation using the Ganzoni formula?

The Ganzoni formula is clinically validated and widely used, but it is not perfectly precise for every individual. Some research suggests it may underestimate iron requirements in patients with very severe anemia or inflammatory conditions that affect hemoglobin interpretation. For this reason, clinicians often round up the dose or use a fixed-dose protocol as a safety margin.

What hemoglobin level is considered iron deficiency anemia?

According to the World Health Organization, iron deficiency anemia is diagnosed when hemoglobin falls below 12 g/dL in adult women (non-pregnant) and below 13 g/dL in adult men. In pregnant women, the threshold is below 11 g/dL. Any reading below these values, combined with low serum ferritin, typically indicates iron deficiency anemia requiring treatment.

How long does it take to correct an iron deficit?

With oral supplementation, correcting an iron deficit typically takes 3 to 6 months, with hemoglobin rising by approximately 1–2 g/dL per month under consistent treatment. IV iron therapy can replenish the full calculated deficit in one to three sessions over a few weeks, which is why it is preferred for patients with severe anemia, poor oral absorption, or urgent needs before surgery.

Who should use an iron deficit calculator?

This calculator is useful for healthcare professionals including doctors, nurses, and pharmacists who need to quickly determine iron therapy doses. It is also helpful for patients who want to understand their iron deficiency diagnosis more deeply. Anyone preparing for a clinical consultation about anemia treatment — or tracking their recovery progress — can benefit from running this iron deficit calculation before their appointment.


Explore Related Calculators on Zo Calculator