一般的に、任意の数値型の任意の値をとり、任意の数値型の非ゼロ値で除算し、妥当な結果を得ることができます。一般的な数値除算
212.7/6 // Double = 35.449999999999996
77L/2.1F // Float = 36.666668
唯一の例外は、私が見つけたことを、私たちは分数の種類(Float
またはDouble
)でBigInt
を混在させることができないということです。
しかしながら、ジェネリックの領域では、Integral
とFractional
のタイプの間にこの興味深い違いがあります。
// can do this
def divideI[I](a: I, b: I)(implicit ev: Integral[I]) = ev.quot(a,b)
// or this
def divideF[F](a: F, b: F)(implicit ev: Fractional[F]) = ev.div(a,b)
// but not this
def divideN[N](a: N, b: N)(implicit ev: Numeric[N]) = ev.???(a,b)
私はこれが理由として好奇心午前ながら、本当の問題は次のようになります。この制限を回避するために利用可能な回避策のいくつかの種類がありますか?
私は、ユーザ(呼び出しコード)を 'Integral'または' Fractional'に制限することなく、プリミティブ型で行うことができるのと同じ(多かれ少なかれ)簡単な数学演算を実行したいと考えています。実装を隠しながら(結果を得るための数学演算)、ユーザーに最も広い入力オプション(任意の数値)を与えたいと思います。数学演算が '+'、 ' - '、 '*'に限定されているなら、簡単に行うことができます。 '/'がその集合に含まれていないことは奇妙に思えます。 – jwvh