Scala 是否有一个除法运算同时产生商和提醒?

Scala 是否有一个除法运算同时产生商和提醒?,scala,math,division,modulo,Scala,Math,Division,Modulo,目前我写了一些丑陋的代码,比如 def div(dividend: Int, divisor: Int) = { val q = dividend / divisor val mod = dividend % divisor (q, mod) } 是否在标准库中指定 在BigInt中,注意/%操作,该操作提供一对除法和提醒(请参阅)。例如,注意 scala> BigInt(3) /% BigInt(2) (scala.ma

目前我写了一些丑陋的代码,比如

    def div(dividend: Int, divisor: Int) = {
        val q = dividend / divisor
        val mod = dividend % divisor
        (q, mod)
    } 

是否在标准库中指定

BigInt
中,注意
/%
操作,该操作提供一对除法和提醒(请参阅)。例如,注意

scala> BigInt(3) /% BigInt(2)
(scala.math.BigInt, scala.math.BigInt) = (1,1)

scala> BigInt(3) /% 2
(scala.math.BigInt, scala.math.BigInt) = (1,1)
其中,第二个示例涉及从
Int
BigInt

的隐式转换

def /%(that: BigInt): (BigInt, BigInt)
除法和余数-返回包含divideToIntegralValue结果和余数的元组

否(除了其他答案中提到的
BigInt
),但您可以添加它:

implicit class QuotRem[T: Integral](x: T) {
  def /%(y: T) = (x / y, x % y)
}
将适用于所有积分类型。您可以通过为每种类型创建单独的类来提高性能,例如

implicit class QuotRemInt(x: Int) extends AnyVal {
  def /%(y: Int) = (x / y, x % y)
}

游戏开始有点晚了,但自从Scala 2.8开始,它就可以工作了:

import scala.math.Integral.Implicits._

val (quotient, remainder) = 5 /% 2

噢不要考虑用整数来做这件事,除非你能容忍比通常慢60X的数学(单独调用%和/或)!有一个更好的基于隐式的解决方案。这一个给出了错误的结果类型,执行起来很糟糕,并且允许在
Int
上调用其他不需要的方法。在优化方面,
除法和
mod
都是昂贵的操作,我们都执行它们。是否有一种方法可以用一个过程同时获得两个结果?一种方法适用于所有
积分
T
Int
Long
BigInt
等)?否。是否可以对
Int
Long
进行测试,应在单独的问题中询问;但是如果可以,如果编译器自动执行,我也不会感到惊讶;(z,x-z*y)
以避免
mod
,但它很可能会以较慢的速度结束。看看,这只是一次性完成两个单独操作的语法糖。虽然它的速度要慢得多,因为它强制使用Tuple2作为返回值(除非有我不熟悉的Tuple2[Int,Int]操作),这确实意味着,如果在某个时刻升级实现以同时高效地执行这两个操作(比如JVM本身的增强),那么您的代码就不必更改以获得效率。我计划显式测试涉及Tuple2开销的性能差异。当我完成后,我会回到这里并发布一个指向结果的链接。