How accuracy is calculated, and why yours differs between sites
Every site that reviews your games shows you an accuracy percentage, and no two of them agree. Play the same game through chess.com, lichess, and Chess Wizard and you will get three different numbers, sometimes several points apart. That is not a bug in any of them. There is no standard for what “accuracy” means, so everyone made one up.
Here is exactly what ours means.
The problem with counting mistakes
The obvious way to score a game is to count the errors: so many inaccuracies, so many mistakes, so many blunders. It is simple, and it is badly behaved.
Consider two blunders. In one, you are up a queen and play a move that leaves you up only a rook. In the other, you are dead level and hang a piece. In centipawn terms the first is a much bigger drop. In practical terms it is nothing — you are still completely winning — and the second one lost the game.
A raw centipawn average has the same problem in reverse. It is dominated by whatever happened in already-decided positions, which is precisely where the moves matter least.
Win probability instead
The fix is to stop measuring in pawns and start measuring in the thing you actually care about: your chance of winning the game.
An evaluation of +9.0 and one of +4.5 differ by 450 centipawns, but both mean “you win this with normal care”. The gap between +0.3 and +0.8 is a tenth the size in pawns and much larger in consequence. So the first thing we do with every evaluation is convert it:
win% = 50 + 50 × (2 / (1 + e−0.00368208 × cp) − 1)
That curve is steep near equality and almost flat once someone is winning, which matches how positions actually behave. It is the same curve lichess uses, deliberately: your number here should be comparable to a number you have probably already seen.
From win% to a score per move
For each of your moves we take your win probability before the move and after it. The difference is what the move cost you. A perfect move costs zero. A move that takes you from 62% to 31% cost 31 points.
That drop becomes a per-move accuracy score:
accuracy = 103.1668 × e−0.04354 × drop − 3.1669, clamped to 0–100
The shape here matters. Small drops barely hurt — losing two or three points of win probability is what normal good moves do, not an error. Large drops fall away fast. And because it is a curve rather than a threshold, there is no cliff edge where a move suddenly counts as a mistake.
Your game accuracy is the plain average of those per-move scores, over your moves only. Your opponent’s blunders do not raise your accuracy, and they should not.
What we do with forced mates
A mate score is not a centipawn value and pretending it is one distorts everything around it. We pin any position with a forced mate to 100% or 0% before doing anything else. Going from mate-in-3 to mate-in-8 is not an error; you are still winning. Going from mate-in-3 to a level position very much is, and pinning gives you the full 100-point drop that deserves.
Why your number differs from chess.com’s
Several reasons, all of them structural:
- Different engine, different depth. Two engines disagree about positions. So does the same engine at depth 15 and depth 25.
- Different curve. chess.com’s accuracy formula is theirs and is not published in full.
- Different treatment of the opening. Some reviewers exclude book moves. We do not — an opening move that leaves theory and loses half a pawn is information about your repertoire, which is exactly what the insights page is built on.
- Different handling of decided positions. Once a game is completely won, most moves score near perfect on any win-probability metric. How long a reviewer keeps counting those moves moves the average.
What the number is good for
Comparing you to you. An accuracy of 78% means very little in isolation. An accuracy of 78% in blitz against 86% in rapid, over fifty games each, tells you something real and actionable.
Spotting drift. Your accuracy over your last twenty games against the twenty before that is one of the few honest signals about whether you are improving or just playing more.
Nothing else. It is not a rating estimate, it is not comparable to a friend’s number from a different site, and a single game’s figure is mostly noise. One accurate game against a weak opponent who never posed a problem is easier than a hard-fought loss.
That last point is why the insights page leads with sentences rather than with the number. “You blunder three times more often with under 30 seconds on the clock” is something you can do something about this week. “Your accuracy is 81.4%” is not.
Where this lives in the code
The formula is defined once, in a single module that the analysis worker and the website both import. That is deliberate: if the number shown on a page could ever disagree with the number stored in the database, the metric is worthless. If we change the definition, it comes with a migration and a note in the changelog, because a stored accuracy that silently means something new is worse than one that is merely imperfect.