加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 通用数字部门

发布时间:2020-12-16 18:13:00 所属栏目:安全 来源:网络整理
导读:作为一般规则,我们可以取任何数字类型的任何值,并将其除以任何数字类型的任何非零值,并获得合理的结果. 212.7 / 6 // Double = 35.44999999999999677L / 2.1F // Float = 36.666668 我发现的一个例外是我们不能将BigInt与小数类型(Float或Double)混合使用.
作为一般规则,我们可以取任何数字类型的任何值,并将其除以任何数字类型的任何非零值,并获得合理的结果.

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

我发现的一个例外是我们不能将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)

虽然我很好奇为什么会这样,但真正的问题是:是否有某种解决方法可以回避这种限制?

解决方法

原因是因为整数除法和浮点除法是两个非常不同的运算,所以所有数值都不共享一个共同的除法运算,尽管人类可能会认为它们都是“除法”.

解决方法是创建4个除法运算:积分/积分,积分/分数,分数/积分,分数/分数.以您认为合适的任何特定于应用程序的方式进行计算.当我为我编写的计算器执行此操作时,如果可能的话,我将其保留在Integral中,否则将其转换为Double.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读