通用数字除法



一般来说,我们可以取任意数字类型的任意值,除以任意数字类型的任意非零值,得到一个合理的结果。

212.7 / 6   // Double = 35.449999999999996
77L / 2.1F  // Float = 36.666668

我发现的一个例外是,我们不能将BigInt与分数类型(FloatDouble)混合。

然而,在泛型领域中,IntegralFractional类型之间有一个有趣的区别。

// 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。

我的理解是这些特征描述了在定义操作下关闭的集合:

Numericplus, minus, times, negate下闭合

Fractional添加div(即plus, minus, times, negate, div),

Integral增加quotrem(即plus, minus, times, negate, quot, rem)。

你为什么要回避它?

最新更新