Player Performance Rating Calculator
ANA›Life Services Authority›National Calculator Authority›Player Performance Rating Calculator
.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }
Player Performance Rating Calculator
Calculate a player's performance rating based on their results against opponents of known ratings. Uses the FIDE performance rating formula: Performance Rating = Average Opponent Rating + Rating Difference based on score percentage.
Opponent Ratings (comma-separated)
Enter the rating of each opponent you played against
Results (comma-separated: 1=Win, 0.5=Draw, 0=Loss)
Enter your result for each game in the same order as opponent ratings
Your Current Rating (optional)
Used to calculate rating change (K-factor based)
K-Factor
40 — New player (fewer than 30 games) 20 — Standard player (rating below 2400) 10 — Elite player (ever reached 2400+)
Calculate Performance Rating ...
function plaCalc() { const oppInput = document.getElementById('pla-opponents').value.trim(); const resInput = document.getElementById('pla-results').value.trim(); const currentRating = document.getElementById('pla-current-rating').value.trim(); const kFactor = parseFloat(document.getElementById('pla-kfactor').value); const resultEl = document.getElementById('pla-result');
if (!oppInput || !resInput) { resultEl.innerHTML = 'Please enter opponent ratings and results.'; return; }
const oppParts = oppInput.split(',').map(s => s.trim()); const resParts = resInput.split(',').map(s => s.trim());
if (oppParts.length !== resParts.length) { resultEl.innerHTML = 'Number of opponent ratings and results must match.'; return; }
if (oppParts.length Please enter at least one game.'; return; }
const opponents = []; for (let i = 0; i 3500) { resultEl.innerHTML = 'Invalid opponent rating at position ' + (i+1) + '. Must be between 0 and 3500.'; return; } opponents.push(r); }
const results = []; for (let i = 0; i Invalid result at position ' + (i+1) + '. Must be 0, 0.5, or 1.'; return; } results.push(r); }
const n = opponents.length; const totalScore = results.reduce((a, b) => a + b, 0); const avgOppRating = opponents.reduce((a, b) => a + b, 0) / n; const scorePercent = totalScore / n;
// FIDE dp table: maps score percentage to rating difference // dp values from FIDE handbook const dpTable = [ [1.00, 800], [0.99, 677], [0.98, 589], [0.97, 538], [0.96, 501], [0.95, 470], [0.94, 444], [0.93, 422], [0.92, 401], [0.91, 383], [0.90, 366], [0.89, 351], [0.88, 336], [0.87, 322], [0.86, 309], [0.85, 296], [0.84, 284], [0.83, 273], [0.82, 262], [0.81, 251], [0.80, 240], [0.79, 230], [0.78, 220], [0.77, 211], [0.76, 202], [0.75, 193], [0.74, 184], [0.73, 175], [0.72, 166], [0.71, 158], [0.70, 149], [0.69, 141], [0.68, 133], [0.67, 125], [0.66, 117], [0.65, 110], [0.64, 102], [0.63, 95], [0.62, 87], [0.61, 80], [0.60, 72], [0.59, 65], [0.58, 57], [0.57, 50], [0.56, 43], [0.55, 36], [0.54, 29], [0.53, 21], [0.52, 14], [0.51, 7], [0.50, 0], [0.49, -7], [0.48, -14], [0.47, -21], [0.46, -29], [0.45, -36], [0.44, -43], [0.43, -50], [0.42, -57], [0.41, -65], [0.40, -72], [0.39, -80], [0.38, -87], [0.37, -95], [0.36, -102],[0.35, -110],[0.34, -117],[0.33, -125], [0.32, -133],[0.31, -141],[0.30, -149],[0.29, -158], [0.28, -166],[0.27, -175],[0.26, -184],[0.25, -193], [0.24, -202],[0.23, -211],[0.22, -220],[0.21, -230], [0.20, -240],[0.19, -251],[0.18, -262],[0.17, -273], [0.16, -284],[0.15, -296],[0.14, -309],[0.13, -322], [0.12, -336],[0.11, -351],[0.10, -366],[0.09, -383], [0.08, -401],[0.07, -422],[0.06, -444],[0.05, -470], [0.04, -501],[0.03, -538],[0.02, -589],[0.01, -677], [0.00, -800] ];
// Find closest dp value using linear interpolation function getDp(pct) { if (pct >= 1.0) return 800; if (pct = dpTable[i+1][0]) { const t = (pct - dpTable[i+1][0]) / (dpTable[i][0] - dpTable[i+1][0]); return dpTable[i+1][1] + t * (dpTable[i][1] - dpTable[i+1][1]); } } return 0; }
const dp = getDp(scorePercent); const performanceRating = Math.round(avgOppRating + dp);
// Expected score using Elo formula for each game let expectedScore = 0; let hasCurrentRating = currentRating !== '' && !isNaN(parseFloat(currentRating)); let ratingChange = null;
- if (hasCurrentRating) {
- const cr = parseFloat(currentRating);
- for (let i = 0; i = 0
- ? '+' + ratingChange.toFixed(1) + ''
- '' + ratingChange.toFixed(1) + '';
var newRatingStr = Math.round(newRating); }
// Wins, draws, losses const wins = results.filter(r => r === 1).length; const draws = results.filter(r => r === 0.5).length; const losses = results.filter(r => r === 0).length;
let html = '### Performance Rating Results '; html += ''; html += 'Games Played' + n + ''; html += 'Score' + totalScore + ' / ' + n + ' (' + wins + 'W / ' + draws + 'D / ' + losses + 'L)'; html += 'Score Percentage' + (scorePercent * 100).toFixed(1) + '%'; html += 'Average Opponent Rating' + avgOppRating.toFixed(1) + ''; html += 'Rating Difference (dp)' + (dp >= 0 ? '+' : '') + dp.toFixed(0) + ''; html += 'Performance Rating' + performanceRating + '';
if (hasCurrentRating) { html += 'Expected Score' + expectedScore.toFixed(2) + ''; html += 'Rating Change (K=' + kFactor + ')' + ratingChangeStr + ''; html += 'New Estimated Rating' + newRatingStr + ''; }
html += '';
// Performance category let category = ''; if (performanceRating >= 2700) category = 'Super Grandmaster level'; else if (performanceRating >= 2500) category = 'Grandmaster level'; else if (performanceRating >= 2400) category = 'International Master level'; else if (performanceRating >= 2300) category = 'FIDE Master level'; else if (performanceRating >= 2200) category = 'Candidate Master level'; else if (performanceRating >= 2000) category = 'Expert / Class A level'; else if (performanceRating >= 1800) category = 'Class B level'; else if (performanceRating >= 1600) category = 'Class C level'; else if (performanceRating >= 1400) category = 'Class D level'; else category = 'Beginner / Class E level';
html += 'Performance category: ' + category + '**
';
resultEl.innerHTML = html; }
#### Formula
Performance Rating = Average Opponent Rating + dp
Where dp is the rating difference corresponding to the player's score percentage, looked up from the FIDE dp table (based on the logistic/Elo probability function).
Score Percentage (p) = Total Score / Number of Games
The dp table maps score percentages to rating differences using the inverse of the Elo expected score formula:
E = 1 / (1 + 10^(−dp/400)) → dp = 400 × log₁₀(p / (1 − p))
Rating Change = K × (Actual Score − Expected Score)
Where Expected Score = Σ 1 / (1 + 10^((Opponent Rating − Your Rating) / 400))
#### Assumptions & References
- Reference: FIDE Rating Regulations effective from 1 July 2017, FIDE Handbook.
More Calculators
- Weatherstripping Length and Cost Calculator
- Drain Cleaning Chemical Dilution Calculator
- Door Swing Clearance Calculator
- Door Rough Opening Size Calculator
- Mediation Session Cost Calculator
- Richter Scale Energy Calculator
- Cannabis Tax & Compliance Cost Calculator
- Data Breach Notification Deadline Calculator
- Patch Management Coverage Calculator
- Endpoint Risk Score Calculator
- Zero Trust Readiness Assessment Calculator
- Florida Data Breach Notification Penalty Estimator
Read Next
Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...