jwv*_*wvh 6 generics scala division
通常,我们可以采用任何数字类型的任何值,然后将其除以任何数字类型的任何非零值,然后得出合理的结果。
212.7 / 6   // Double = 35.449999999999996
77L / 2.1F  // Float = 36.666668
我发现的一个例外是,我们不能将a BigInt与分数类型(Float或Double)混合使用。
但是,在泛型领域中,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)
尽管我对这是为什么感到好奇,但真正的问题是:是否有某种解决方法可避免此限制?
原因是因为整数除法和浮点除法是两个非常不同的运算,所以Numerics尽管人类可能会将它们都视为“除法”,但它们都不共享相同的除法运算。
解决方法是创建4个除法运算:积分/积分,积分/分数,分数/分数,分数/分数。以您认为合适的任何特定于应用程序的方式进行计算。当我为编写的计算器执行此操作时,如果可能,我将其保留在Integral中,否则将其强制转换为Double。
我的理解是,这些特征描述了在定义的操作下封闭的集合:
Numeric关闭于plus, minus, times, negate,
Fractional添加div(即plus, minus, times, negate, div),
Integral添加quot和rem(即plus, minus, times, negate, quot, rem)。
为什么你想回避它?