T20 (20 Overs)
ODI (50 Overs)
Test Match (90 Overs/Day)
Custom
Balls part cannot exceed .5
Current Run Rate (CRR):–
Projected Score:–
Runs Needed:–
Balls Remaining:–
Required Run Rate (RRR):–
How to Calculate Cricket Run Rate
In the game of cricket, especially in limited-overs formats like T20 and ODI, the Run Rate (RR) is a critical statistic. It indicates the average number of runs a batting team scores per over. Whether you are analyzing a team's performance in the first innings or calculating the equation needed to win in the second innings, understanding the math behind runs and overs is essential.
1. Current Run Rate (CRR) Formula
The Current Run Rate is calculated by dividing the total runs scored by the total overs bowled. However, cricket overs are not standard decimals. An over consists of 6 balls.
CRR = Total Runs Scored / Total Overs Bowled
Important Note on Overs: To calculate correctly, you must convert partial overs into a fraction. For example, if the score is at 10.4 overs (10 overs and 4 balls):
The decimal part ".4" represents 4 balls out of 6.
Mathematically, this is 10 + (4/6) = 10.666 overs.
If the score is 85 runs, CRR = 85 / 10.666 = 7.97 runs per over.
2. Projected Score Calculation
During the first innings, teams and analysts often project the final score based on the Current Run Rate. This assumes the team continues scoring at the exact same pace for the remaining overs.
Projected Score = CRR × Total Overs in Match
For example, in a T20 match (20 overs), if a team is 70/2 after 10 overs (CRR 7.00), the projected score is 7.00 × 20 = 140.
3. Required Run Rate (RRR)
In the second innings, the team batting second chases a specific "Target". The Required Run Rate tells them how many runs per over they need to score to win.
RRR = Runs Needed / Overs Remaining
Example Scenario:
Target: 160 runs
Current Score: 100 runs
Overs Bowled: 15 (5 overs remaining)
Runs Needed: 60
RRR = 60 / 5 = 12.00 runs per over.
Why Use This Calculator?
While the math seems simple, handling the conversion of balls (e.g., 0.1 to 0.5) into mathematical decimals can be tricky manually. This tool instantly converts cricket notation (like 12.3 overs) into precise mathematical values to give you accurate projected scores and required rates for T20, ODI, and Test matches.
function updateTotalOvers() {
var format = document.getElementById('matchFormat').value;
var customContainer = document.getElementById('customOversContainer');
var customInput = document.getElementById('totalOversInput');
if (format === 'custom') {
customContainer.style.display = 'block';
customInput.value = ";
} else {
customContainer.style.display = 'none';
customInput.value = format;
}
}
function toggleTargetInput() {
var isChase = document.getElementById('isChase').checked;
var targetDiv = document.getElementById('target-container');
if (isChase) {
targetDiv.style.display = 'block';
} else {
targetDiv.style.display = 'none';
document.getElementById('targetScore').value = ";
}
}
function calculateCricketStats() {
// Inputs
var matchFormat = document.getElementById('matchFormat').value;
var totalOvers = 0;
if (matchFormat === 'custom') {
totalOvers = parseFloat(document.getElementById('totalOversInput').value);
} else {
totalOvers = parseFloat(matchFormat);
}
var runs = parseFloat(document.getElementById('runsScored').value);
var oversInput = document.getElementById('oversBowled').value;
var isChase = document.getElementById('isChase').checked;
var target = parseFloat(document.getElementById('targetScore').value);
var oversError = document.getElementById('oversError');
// Reset display
oversError.style.display = 'none';
// Validation
if (isNaN(runs) || runs 1) {
balls = parseInt(parts[1]);
// Handle if someone types 10.40 or 10.4
// In cricket input usually .4 means 4 balls.
// If user types 10.6 or higher, it's invalid in strict cricket notation (6 balls = 1 over)
if (balls >= 6) {
oversError.style.display = 'block';
return;
}
}
// Calculate actual decimal duration for math
// Example: 10.3 overs = 10 + 3/6 overs = 10.5 math overs
var mathematicalOvers = completedOvers + (balls / 6);
if (mathematicalOvers === 0) {
alert("Overs bowled cannot be zero.");
return;
}
if (mathematicalOvers > totalOvers) {
alert("Overs bowled cannot exceed Total Overs for the match format.");
return;
}
// 1. Calculate CRR
var crr = runs / mathematicalOvers;
document.getElementById('displayCRR').innerText = crr.toFixed(2);
// 2. First Innings Logic
var displayDiv = document.getElementById('result-area');
var projectedRow = document.getElementById('projectedRow');
var chaseStats = document.getElementById('chaseStats');
displayDiv.style.display = 'block';
if (!isChase) {
// Projected Score
var projected = crr * totalOvers;
document.getElementById('displayProjected').innerText = Math.round(projected);
projectedRow.style.display = 'flex';
chaseStats.style.display = 'none';
} else {
// 3. Second Innings Logic (Chase)
if (isNaN(target)) {
alert("Please enter the Target Score.");
return;
}
projectedRow.style.display = 'none'; // Hide projected in chase, RRR is more important
chaseStats.style.display = 'block';
var runsNeeded = target – runs;
// Balls Remaining
// Total balls in match = totalOvers * 6
// Balls bowled = (completedOvers * 6) + balls
var totalBallsAvailable = totalOvers * 6;
var ballsBowled = (completedOvers * 6) + balls;
var ballsRemaining = totalBallsAvailable – ballsBowled;
if (runsNeeded <= 0) {
document.getElementById('displayRunsNeeded').innerText = "0 (Target Reached)";
document.getElementById('displayBallsRemaining').innerText = ballsRemaining;
document.getElementById('displayRRR').innerText = "N/A";
} else if (ballsRemaining <= 0) {
document.getElementById('displayRunsNeeded').innerText = runsNeeded + " (Match Over)";
document.getElementById('displayBallsRemaining').innerText = "0";
document.getElementById('displayRRR').innerText = "Impossible";
} else {
// RRR Calculation
// RRR = runsNeeded / (ballsRemaining / 6)
var oversRemainingMath = ballsRemaining / 6;
var rrr = runsNeeded / oversRemainingMath;
document.getElementById('displayRunsNeeded').innerText = runsNeeded;
document.getElementById('displayBallsRemaining').innerText = ballsRemaining;
document.getElementById('displayRRR').innerText = rrr.toFixed(2);
}
}
}
// Initialize default format
updateTotalOvers();