功能说明
百分位数用于延迟、分数和监控指标分析。该实现复制并排序输入,使用线性插值计算任意 0 到 100 的百分位;quantile 接受 0 到 1 的分位数并复用同一逻辑。输入数组不会被修改,排序始终使用数值比较,避免默认字典序把 10 排在 2 前面。
关键代码
percentile 校验非空数组、所有元素为有限数字、p 在 0 到 100 之间。排序后计算浮点索引 (n-1)*p/100,取上下整数位置;若相同直接返回,否则按小数部分线性插值。quantile 把 q 乘以 100 后调用 percentile。
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);
使用注意
百分位定义有多种,本实现采用线性插值,结果可能不是原数组中的值。空数组会抛 RangeError。p 为 NaN 或越界同样抛错。重复值不影响计算。该方法需要复制并排序,复杂度为 O(n log n),超大样本应使用近似算法或流式分位数。
验证方式
断言 percentile([1, 2, 3, 4], 50) 返回 2.5,percentile([1, 2, 3, 4], 0) 返回 1,percentile([1, 2, 3, 4], 100) 返回 4。quantile([1, 2, 3, 4], 0.5) 返回 2.5。p 为 101 或 q 为 -0.1 抛 RangeError,数组含 NaN 抛 TypeError。