Heart Rate Zone Calculator
Calculate your Max Heart Rate and Target Training Zones
Your Age (Years)
Resting Heart Rate (BPM)
Calculate My Zones
Your Vital Statistics
Estimated Max HR
– BPM
Heart Rate Reserve
– BPM
Intensity Zone
Target Range (BPM)
Benefit
Understanding the Heart Rate Equation
Calculating your target heart rate is essential for optimizing cardiovascular workouts and ensuring you are training at the right intensity for your specific fitness goals. Whether you want to burn fat, improve endurance, or increase your anaerobic threshold, knowing your numbers is the first step.
The Fox Formula (Standard)
The most common and simplest heart rate equation is the Fox Formula. It is used by major health organizations to estimate Maximum Heart Rate (MHR):
MHR = 220 – Age
The Karvonen Formula (Advanced)
While the Fox formula is easy, the Karvonen Formula is more accurate because it factors in your Resting Heart Rate (RHR) . This accounts for your current fitness level. The difference between your Max HR and your Resting HR is called your Heart Rate Reserve (HRR) .
Target Heart Rate = [(Max HR − Resting HR) × %Intensity] + Resting HR
Training Zones Explained
Zone 1 (50-60%): Very Light. Great for recovery and warming up. Improves overall health but doesn't build much "fitness."
Zone 2 (60-70%): Light (Fat Burn). This is the "sweet spot" for long-duration cardio. It improves endurance and utilizes fat as a primary fuel source.
Zone 3 (70-80%): Moderate (Aerobic). Improves cardiovascular capacity and respiratory efficiency. You can talk in short sentences.
Zone 4 (80-90%): Hard (Anaerobic). Increases high-speed endurance. You will feel "the burn" as lactic acid builds up.
Zone 5 (90-100%): Maximum. This is for short bursts of sprinting or HIIT. Improves peak performance and speed.
Realistic Example Calculation
If you are 40 years old with a resting heart rate of 70 BPM and want to train at 70% intensity:
Max HR: 220 – 40 = 180 BPM
Heart Rate Reserve: 180 – 70 = 110 BPM
Target: (110 * 0.70) + 70 = 77 + 70 = 147 BPM
function calculateHeartRate() {
var age = parseFloat(document.getElementById('userAge').value);
var rhr = parseFloat(document.getElementById('restingHR').value);
if (isNaN(age) || age 120) {
alert("Please enter a valid age.");
return;
}
if (isNaN(rhr) || rhr 150) {
alert("Please enter a realistic resting heart rate (usually 40-100 BPM).");
return;
}
// Fox Formula
var maxHR = 220 – age;
var hrr = maxHR – rhr;
// Display basic stats
document.getElementById('maxHRVal').innerText = Math.round(maxHR);
document.getElementById('hrrVal').innerText = Math.round(hrr);
var zones = [
{ name: "Zone 1 (Recovery)", percent: "50-60%", low: 0.50, high: 0.60, benefit: "Warm-up / Recovery" },
{ name: "Zone 2 (Fat Burn)", percent: "60-70%", low: 0.60, high: 0.70, benefit: "Endurance & Fat Loss" },
{ name: "Zone 3 (Aerobic)", percent: "70-80%", low: 0.70, high: 0.80, benefit: "Stamina & Cardio" },
{ name: "Zone 4 (Anaerobic)", percent: "80-90%", low: 0.80, high: 0.90, benefit: "Speed & Power" },
{ name: "Zone 5 (Peak)", percent: "90-100%", low: 0.90, high: 1.00, benefit: "Performance Sprints" }
];
var tableBody = document.getElementById('zoneTableBody');
tableBody.innerHTML = "";
for (var i = 0; i < zones.length; i++) {
var zone = zones[i];
var lowBPM = Math.round((hrr * zone.low) + rhr);
var highBPM = Math.round((hrr * zone.high) + rhr);
var row = document.createElement('tr');
row.style.borderBottom = "1px solid #eee";
var cellName = document.createElement('td');
cellName.style.padding = "12px";
cellName.innerHTML = "
" + zone.name + " " + zone.percent + " ";
var cellRange = document.createElement('td');
cellRange.style.padding = "12px";
cellRange.innerText = lowBPM + " – " + highBPM + " BPM";
var cellBenefit = document.createElement('td');
cellBenefit.style.padding = "12px";
cellBenefit.innerText = zone.benefit;
row.appendChild(cellName);
row.appendChild(cellRange);
row.appendChild(cellBenefit);
tableBody.appendChild(row);
}
document.getElementById('hr-results').style.display = 'block';
// Scroll to results smoothly
document.getElementById('hr-results').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}