百分位数计算器

时间:2016-04-07 14:55:04

标签: scala percentile

我一直在尝试创建一个小方法来计算seq中给定的百分位数。它几乎可以工作。问题是我不知道为什么不起作用。我希望你的一个“比我更聪明”的人可以帮助我。

我希望结果是它会从seq中返回seq的项目小于等于返回值的项目。

def percentile[Int](p: Int)(seq: Seq[Int]) = {
  require(0 <= p && p <= 100)                      // some value requirements
  require(!seq.isEmpty)                            // more value requirements
  val sorted = seq.sorted
  val k = math.ceil((seq.length - 1) * (p / 100)).toInt
  return sorted(k)
}

例如,如果我有

val v = Vector(7, 34, 39, 18, 16, 17, 21, 36, 17, 2, 4, 39, 4, 19, 2, 12, 35, 13, 40, 37)

我调用我的函数percentile(11)(v)返回值为2.但是,10%的向量小于或等于2,而不是像我调用的11%。 percentile(11)(v)应返回4.

2 个答案:

答案 0 :(得分:5)

您的错误在此行中:

 val k = math.ceil((seq.length - 1) * (p / 100)).toInt

,尤其是:p / 100。由p为Int&lt; = 100且&gt; = 0,p/100将始终等于0或1(如果p == 100)。如果需要浮点结果,则必须将两个值之一加宽:p/100.0

 val k = math.ceil((seq.length - 1) * (p / 100.0)).toInt

旁注:您不需要[Int]类型参数

答案 1 :(得分:4)

问题在于

中的p / 100部分
val k = math.ceil((seq.length - 1) * (p / 100)).toInt

由于p的类型为Int100也是Int,因此除法是一个返回Int的整数除法。如果p100Double,则结果为Double

最简单的解决方法是在p / 100.0中更改该部分。