The Duckworth-Lewis-Stern (DLS) method is the standard mathematical system adopted by the International Cricket Council (ICC) to calculate target scores in rain-interrupted limited-overs cricket matches (ODIs and T20s). Unlike a simple Average Run Rate calculation, DLS accounts for the two key resources available to a batting team: Overs Remaining and Wickets in Hand.
This DLS Run Rate Calculator estimates the current "Par Score" for the team batting second. The Par Score is the number of runs the chasing team should have scored for the number of wickets lost and overs consumed, to be considered "equal" to the first team's performance.
How Does the Calculation Work?
The core of the DLS method rests on the concept of "Resources." A team starts with 100% resources (in a 50-over match). As overs pass and wickets fall, the percentage of resources remaining depletes.
Resources: The ability to score runs depends on having balls to face and batsmen to hit them.
Exponential Decay: Losing a wicket early in the innings reduces scoring potential significantly more than losing a wicket in the final over. Similarly, having 10 overs left with 10 wickets in hand is far more valuable than 10 overs with 1 wicket in hand.
Par Score: If rain stops play permanently, the winner is decided by comparing the current score to the DLS Par Score. If the chasing team is above the Par Score, they win.
Using the Calculator
To use this tool effectively during a live match:
Match Format: Select whether it is an ODI (50 overs) or T20 (20 overs). This sets the baseline resources.
Team 1 Score: Enter the final total runs scored by the team that batted first.
Current State: Enter the chasing team's current score, the exact overs bowled (e.g., 12.3 for 12 overs and 3 balls), and the number of wickets lost.
Why not just use Run Rate?
Net Run Rate (runs per over) is flawed for interruptions because it ignores wickets. A team that is 100/0 in 20 overs is in a much stronger position than a team that is 100/8 in 20 overs, even though their run rate is identical (5.00). DLS corrects this by assigning a higher Par Score target to the team that has lost more wickets.
// Decay constants (approximate for Standard Edition approximation)
// k values for 0 to 9 wickets lost
var decayConstants = [
0.045, // 0 wkts
0.047, // 1 wkts
0.050, // 2 wkts
0.054, // 3 wkts
0.060, // 4 wkts
0.068, // 5 wkts
0.080, // 6 wkts
0.100, // 7 wkts
0.140, // 8 wkts
0.240 // 9 wkts
// 10 wkts is 0 resources
];
function updateTotalOvers() {
var format = document.getElementById('matchFormat').value;
document.getElementById('totalOvers').value = format;
}
function parseOvers(oversInput) {
var str = oversInput.toString();
var parts = str.split('.');
var overs = parseInt(parts[0]);
var balls = 0;
if (parts.length > 1) {
balls = parseInt(parts[1]);
}
// Validate cricket balls (cannot be > 5)
if (balls >= 6) {
// Treat 12.6 as 13.0 loosely, or just cap it.
// Better to interpret 12.6 as error or wrap? Let's normalize.
overs += Math.floor(balls / 6);
balls = balls % 6;
}
return overs + (balls / 6);
}
function calculateResources(oversLeft, wicketsLost) {
if (wicketsLost >= 10) return 0.0;
if (oversLeft totalOvers) {
alert("Overs bowled cannot exceed total overs.");
return;
}
// 3. Logic
// Calculate Resources available at start of innings
// Usually, if it's a full match, start resources is based on 50 overs (100%) or 20 overs (~T20 standard).
// However, standard DL normalizes 50 overs as 100%.
// If it's T20, we calculate resources for 20 overs.
var resStart = calculateResources(totalOvers, 0); // Start of innings resources
var oversRemaining = totalOvers – oversBowled;
var resNow = calculateResources(oversRemaining, wickets); // Current resources
var resUsed = resStart – resNow;
var resProportion = resUsed / resStart;
// Par Score Calculation
// Par Score = Team 1 Score * (Resources Used / Resources Total)
var parScoreFloat = t1Score * resProportion;
var parScore = Math.floor(parScoreFloat);
// Status Logic
var diff = t2Score – parScore;
// Display
document.getElementById('resultsArea').style.display = 'block';
document.getElementById('resRemaining').innerText = resNow.toFixed(1) + "%";
document.getElementById('parScoreDisplay').innerText = parScore;
document.getElementById('finalTargetDisplay').innerText = (t1Score + 1); // If match completes
var statusBox = document.getElementById('statusBox');
statusBox.className = 'dls-status-box'; // reset classes
if (t2Score > parScore) {
statusBox.innerHTML = "Team 2 is AHEAD by " + (t2Score – parScore) + " runs (DLS)";
statusBox.classList.add('status-win');
} else if (t2Score < parScore) {
statusBox.innerHTML = "Team 2 is BEHIND by " + (parScore – t2Score) + " runs (DLS)";
statusBox.classList.add('status-loss');
} else {
statusBox.innerHTML = "Scores are LEVEL (Tie on DLS)";
statusBox.classList.add('status-tie');
}
}