Percentile Calculator

Drop in a list of latencies (or any numbers) and get p50, p90, p95 and p99 instantly, plus min, max and mean — with the sorted distribution drawn as a histogram and each percentile marked on it. See exactly why the average hides your worst requests and the tail is what users feel.

36.50p50 · medianhalf are below this
97.70p901 in 10 is worse
215.5p951 in 20 is worse
454.2p99 · the tail1 in 100 is worse
64.83Meanthe average, tail-skewed
19 – 540Min – Max40 values
Distribution & percentile markers
24 value(s)10 value(s)1 value(s)1 value(s)0 value(s)0 value(s)0 value(s)1 value(s)1 value(s)0 value(s)0 value(s)0 value(s)0 value(s)1 value(s)0 value(s)0 value(s)0 value(s)0 value(s)0 value(s)0 value(s)0 value(s)0 value(s)0 value(s)1 value(s)p50p90p95p9919540

Bars show how many values fall in each range; the vertical lines mark p50, p90, p95 and p99. Notice how the tail percentiles sit far to the right of the median.

The average lies; the tail tells the truth

Report a single number for a set of latencies and you'll reach for the mean — and it will mislead you. A service that answers in 30 ms for 99 requests and 3 seconds for the hundredth has a mean around 60 ms, which sounds great and describes none of the requests. The typical user got 30 ms; one user got a 3-second stall. Averages smear those two realities into a fiction.

What a percentile is

The p-th percentile is the value below which p% of your measurements fall. p50 (the median) is the typical case — half are faster, half slower. p90, p95 and p99 walk out into the tail: p99 is the line your worst 1% of requests cross. Because every user hits many services per action, the tail of one service becomes the common experience of your product — which is why SLOs are written against p95 and p99, never the mean.

How it's computed

Sort the values, then locate the position p/100 × (n − 1) in the sorted list. If it lands between two ranks, interpolate linearly between them. This "type 7" method (the NumPy and Excel PERCENTILE.INC default) is what this tool uses — so p50 of 1…100 is 50.5, sitting exactly between the 50th and 51st values, not a rounded 50.

Reading the histogram

The bars above show how many values fall in each range; the coloured lines drop p50, p90, p95 and p99 onto that distribution. On a healthy latency profile the bars cluster on the left and the p99 line sits far out to the right — that gap between median and tail is the story the mean was hiding.

How it works

  • Percentile position = p/100 × (n − 1) in the sorted list, then interpolate.
  • p50 is the median; p90 / p95 / p99 describe the tail your users feel.
  • The mean is skewed by outliers — percentiles describe the real distribution.
  • Paste any separator: spaces, commas, tabs or newlines all parse.

Frequently asked questions

How is a percentile calculated?

Sort the values, then find the position p/100 × (n − 1) in the sorted list (0-indexed). If that position lands between two values, interpolate linearly between them. This "linear interpolation" method (also called type 7, the NumPy and Excel PERCENTILE.INC default) is what this calculator uses, so p50 of 1…100 is 50.5, not 50.

What is p99 latency and why does it matter?

p99 is the value below which 99% of your measurements fall — the threshold your worst 1% of requests exceed. It matters because averages hide tail behaviour: a service can have a great mean while 1 in 100 users waits seconds. Tail percentiles (p95, p99, p99.9) are what SLOs are written against because they reflect the experience real users actually notice.

Why use percentiles instead of the average?

The mean is dragged around by outliers and hides the shape of the distribution — a handful of slow requests can inflate it while telling you nothing about the typical case, or a low mean can mask a brutal tail. Percentiles describe the distribution directly: p50 for the typical request, p90/p95/p99 for how bad the bad cases get.

What is the difference between p50 and the median?

They are the same thing: p50, the 50th percentile, is the median — the value that splits the data in half, with 50% of observations below it and 50% above. This tool labels it p50 to sit naturally alongside p90, p95 and p99.