Percentile and Quantile Calculation
Compute percentiles and quantiles with linear interpolation on a copied sorted array, validating bounds and numeric input.
Code
export function percentile(values: readonly number[], p: number): number {
if (!Array.isArray(values) || values.length === 0) {
throw new RangeError("values must be a non-empty array");
}
if (!Number.isFinite(p) || p < 0 || p > 100) {
throw new RangeError("p must be between 0 and 100");
}
if (!values.every(Number.isFinite)) {
throw new TypeError("values must be finite numbers");
}
const sorted = [...values].sort((a, b) => a - b);
const index = (sorted.length - 1) * (p / 100);
const lower = Math.floor(index);
const upper = Math.ceil(index);
if (lower === upper) return sorted[lower];
return sorted[lower] + (sorted[upper] - sorted[lower]) * (index - lower);
}
export function quantile(values: readonly number[], q: number): number {
if (!Number.isFinite(q) || q < 0 || q > 1) {
throw new RangeError("q must be between 0 and 1");
}
return percentile(values, q * 100);
}Report a problem with this exampleOpens a pre-filled issue on GitHub.