2016-04-07 283 views
2

我一直在試圖創建一個小的方法來計算從seq給定的百分位數。它幾乎可以工作。問題是我不知道爲什麼不起作用。我希望你的一個「比我聰明」的人能夠幫助我。百分位數計算器

我希望得到的結果是,它會返回來自seq的n個起始項小於等於返回值的項。

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.

+0

你是什麼意思,「它的作品幾乎......它不工作」?這應該是一個謎題?如果您遇到錯誤,請提供錯誤! – eliasah

+0

沒有錯誤,但返回有時是不正確的 –

回答

4

你的錯誤是在該行中:

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

,特別是在這裏:p/100。如果p爲Int < = 100且> = 0,則p/100將始終等於0或1(如果是p == 100)。如果你想要一個浮點結果,你必須擴大兩個值之一翻番:p/100.0

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

在一個側面說明:您不需要[Int]類型參數

3

問題是與在

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

部分p/100由於pInt類型和100也是Int,除法是一個整數除法那返回Int。如果p100Double,則結果將是Double

最簡單的修復方法是在p/100.0中更改該部分。

+1

打你14秒:D –

+0

最好的部分是,我們都建議相同的解決方案:) – Arjan

+0

謝謝你們,你們:) –