percentile function

double? percentile(
  1. Iterable<num> values,
  2. double p
)

Implementation

double? percentile(Iterable<num> values, double p) {
  if (p < 0 || p > 1) return null;
  final List<double> list = values.map((num n) => n.toDouble()).toList()..sort();
  if (list.isEmpty) return null;
  if (list.length == 1) return list[0];
  final double index = p * (list.length - 1);
  final int i = index.floor().clamp(0, list.length - 1);
  final int j = (i + 1).clamp(0, list.length - 1);
  final double t = index - i;
  return list[i] + t * (list[j] - list[i]);
}