CalcOpenly

Grade curve calculator

Grade curve calculator: rescale a class's scores to a target mean and standard deviation, or add flat points, with z-scores and percentile ranks.

Updated Checked against 4 worked examples

Curved scores above this are capped. Leave blank for no cap.
Leave blank to see the median student.
More options
Try
Curved score
Curved score: 71.20
Shown to 2 decimal places, half-even
z-score
−0.3796
Percentile rank in the class
37.5
Class mean
71.75
Class standard deviation
9.878639
Curved mean
75
Curved standard deviation
10
Scores capped
0
Students
20

A score of 68 is 0.38 standard deviations below the class mean of 71.75 and becomes 71.2 after the curve. Its percentile rank stays 37.5: rescaling changes scores, not the order of students.

Original score → curved score

50607080905060708090Original scoreCurved score68 → 71.2
StudentsNo change
Every student (20 rows)
#ScorezCurvedPercentile rank
152−1.999355.00742.5
258−1.391961.08117.5
361−1.088264.117912.5
463−0.885766.142517.5
564−0.784567.154822.5
666−0.582169.179427.5
767−0.480870.191632.5
868−0.379671.203937.5
970−0.177173.228542.5
1071−0.075974.240847.5
11720.025375.253155
12720.025375.253155
How it's calculated S
  1. Class mean

    xˉ=∑xin=71.75\bar x = \frac{\sum x_i}{n} = 71.75
  2. Class standard deviation (population)

    σ=∑(xi−xˉ)2n=9.878639\sigma = \sqrt{\frac{\sum (x_i - \bar x)^2}{n}} = 9.878639
  3. Curve rule

    xcurved=75+10×x−71.759.878639x_{\text{curved}} = 75 + 10 \times \frac{x - 71.75}{9.878639}

    A linear rescale keeps every student's z-score and rank.

  4. Your score

    z=68−71.759.878639=−0.379607,xcurved=71.20393z = \frac{68 - 71.75}{9.878639} = -0.379607,\quad x_{\text{curved}} = 71.20393
  5. Percentile rank

    PR=B+12En×100=7+12×120×100=37.5PR = \frac{B + \tfrac12 E}{n} \times 100 = \frac{7 + \tfrac12 \times 1}{20} \times 100 = 37.5

    B counts class scores below this score and E counts scores equal to it. Ranks come from the original scores.

About the grade curve calculator

A z-score curve rescales every score linearly. Each student's z-score, z = (x − class mean)/SD, is kept and mapped onto the target: curved = target mean + target SD × z. A flat curve instead adds the same number of points to everyone so that the class mean reaches the target. Both keep the order of students, so percentile ranks do not change; only scores pushed above the highest possible score are cut back to it.

The default class of 20 has a mean of 71.75 and a population SD of 9.88. Curving it to a mean of 75 and an SD of 10 turns a 68 (z = −0.38) into 71.20, and its percentile rank stays 37.5.

A z-score curve does not make scores normally distributed: a skewed class stays skewed. When scores are capped, the curved mean falls below the target, and a warning shows the actual value.

Worked examples

Default class, score 68

Class scores
52, 58, 61, 63, 64, 66, 67, 68, 70, 71, 72, 72, 74, 75, 77, 79, 81, 84, 88, 93
Curve by
Target mean and SD
Target mean
75
Target standard deviation
10
Highest possible score
100
Your score
68
Class mean
71.75
Class standard deviation
9.878639
z-score
-0.3796
Curved score
71.20
Percentile rank in the class
37.5
Curved mean
75
Curved standard deviation
10
Scores capped
0

Checked against: Python statistics.mean and pstdev (9.87863857); curved = 75 + 10·(68 − 71.75)/σ in decimal; PR = (7 + ½·1)/20 × 100

Add points to reach 70

Class scores
55, 60, 65, 70, 75
Curve by
Add points
Target mean
70
Highest possible score
100
Your score
60
Curved score
65.00
Percentile rank in the class
30
Curved mean
70
Curved standard deviation
7.071068

Checked against: Hand computation: mean 65, so +5 points; PR of 60 = (1 + ½·1)/5 × 100; population SD √50 is unchanged by a shift

Cap at 100 pulls the mean below target

Class scores
40, 55, 60, 70, 95
Curve by
Target mean and SD
Target mean
80
Target standard deviation
15
Highest possible score
100
Your score
95
Curved score
100.00
Scores capped
1
Curved mean
78.911266
Percentile rank in the class
90

Checked against: Python decimal: σ = 18.2757 (statistics.pstdev); 95 → 80 + 15 × 1.69624 = 105.44, capped to 100; mean of the capped curved list

Sample SD, blank score uses the median

Class scores
58, 70, 74, 81, 92
Curve by
Target mean and SD
Target mean
75
Target standard deviation
10
Standard deviation of the class
Sample (divide by n − 1)
Highest possible score
100
Class standard deviation
12.649111
z-score
-0.0791
Curved score
74.21
Percentile rank in the class
50

Checked against: Python statistics.stdev = 12.6491106 (√160); median 74 → 75 + 10·(74 − 75)/√160

Questions

How do you curve grades on a bell curve?

Find the class mean and standard deviation, turn each score into a z-score, then map it onto the target: curved = target mean + target SD × z. In the default class (mean 71.75, SD 9.88) with a target of 75 and 10, a score of 68 has z = −0.38 and becomes 75 + 10 × (−0.38) = 71.20. Every student keeps the same rank.

What is the difference between a flat curve and a bell curve?

A flat curve adds the same points to every score, so the spread stays as it was: raising a class mean from 65 to 70 adds 5 points to everyone. A z-score curve also sets the spread. With the defaults the SD goes from 9.88 to 10, so 52 rises to 55.01 and 93 to 96.51. If the target SD is well above the class SD, low scores can even fall.

What is a percentile rank?

The percentage of the class scoring below a score, with ties counted as half: PR = (B + ½E)/n × 100, the definition used in classical test theory (Crocker & Algina, 1986). In the default class of 20, 7 scores are below 68 and 1 equals it, so PR = (7 + 0.5)/20 × 100 = 37.5. A linear curve never changes percentile ranks, because it keeps the order of the scores.

Should I use the population or sample standard deviation to curve grades?

Use the population SD (divide by n) when the class is the whole group being graded, which is the default. The sample SD (divide by n − 1) estimates the spread of a larger group the class was drawn from. For 20 students the two differ by a factor of √(20/19) = 1.026; switching to the sample SD moves the default 68 from 71.20 to 71.30 and the top score of 93 from 96.51 to 95.97.

How accurate is the grade curve calculator?

Accuracy depends on your inputs and the method's assumptions. Decimal arithmetic uses 50 significant digits, but estimates, numerical methods and source data can be less precise; the displayed rounding does not remove those limits. It is checked against 4 worked examples whose answers come from independent sources; for example, “Default class, score 68” is checked against Python statistics.mean and pstdev (9.87863857); curved = 75 + 10·(68 − 71.75)/σ in decimal; PR = (7 + ½·1)/20 × 100.

Where does the method come from?

NIST/SEMATECH e-Handbook of Statistical Methods, §1.3.5.1 (mean) and §1.3.5.6 (standard deviation); Crocker & Algina, Introduction to Classical and Modern Test Theory (1986), ch. 19: percentile ranks and linear standard scores.

About this calculator

z=x−xˉs,xcurved=μtarget+σtarget z,PR=B+12En×100z = \frac{x - \bar x}{s},\qquad x_{\text{curved}} = \mu_{\text{target}} + \sigma_{\text{target}}\,z,\qquad PR = \frac{B + \tfrac12 E}{n}\times 100

Sources

  1. NIST/SEMATECH e-Handbook of Statistical Methods, §1.3.5.1 (mean) and §1.3.5.6 (standard deviation)
  2. Crocker & Algina, Introduction to Classical and Modern Test Theory (1986), ch. 19: percentile ranks and linear standard scores

Checked against references

4 worked examples with independently sourced answers ship with this calculator. They run in the test suite; you can run them here too.

Related calculators

Allow optional Google Analytics to measure page visits? Calculators work either way. Privacy and choices

Optional analytics: off.