2016-04-07 11 views
2

私は、指定されたパーセンタイルを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%がIように、11%2以下でない場合、例えば電話しています。

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

、特にここに:p/100percentile(11)(v)は4

+0

「それはほとんど動作します...動作しません」とはどういう意味ですか?これはパズルになるはずですか?エラーが発生した場合は、エラーを提供してください! – eliasah

+0

エラーはありませんが、返品が間違っている場合があります –

答えて

4

あなたのエラーは、この行にあるを返す必要があります。 pとInt < = 100と> = 0の場合、p/100は常に0または1に等しくなります(p == 100の場合)。あなたは浮動小数点の結果をしたい場合は、二重に2つの値の1を広げる必要があります:p/100.0サイドノートで

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

:あなたは[Int]型パラメータを必要としない

3

問題がですpタイプIntであり、100Intあるため一部

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

p/100は、分割された整数除算でありますIntを返します。 pまたは100のいずれかがDoubleの場合、結果はDoubleになります。

最も簡単な修正は、その部分をp/100.0に変更することです。

+1

14秒遅れました:D –

+0

最高の部分は、両方とも同じ解決策をアドバイスしていることです。 – Arjan

+0

ありがとうございました。 –

関連する問題