是否存在产生商和提醒的除法运算?

7 math scala division modulo

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

    def div(dividend: Int, divisor: Int) = {
        val q = dividend / divisor
        val mod = dividend % divisor
        (q, mod)
    } 
Run Code Online (Sandbox Code Playgroud)

是否在标准库中指定?

Mor*_*gen 16

游戏有点晚了,但是自从Scala 2.8起作用:

import scala.math.Integral.Implicits._

val (quotient, remainder) = 5 /% 2
Run Code Online (Sandbox Code Playgroud)

  • 看[source(Integral.scala)](https://github.com/scala/scala/blob/d96b8eb48e83d400c03663a05b66ec218ead9c14/src/library/scala/math/Integral.scala#L24),这只是语法糖一口气进行两次单独的操作。 (2认同)
  • 虽然它的速度要慢得多,因为它强制使用 Tuple2 作为返回值(除非有我不熟悉的 Tuple2[Int, Int] 操作),但这确实意味着如果实现在某个时刻升级为有效如果同时执行这两个操作(例如 JVM 本身的增强),您的代码无需更改即可获得效率。我计划明确测试涉及 Tuple2 开销的性能差异。完成后我会回到这里并发布结果链接。 (2认同)

Ale*_*nov 6

否(除了BigInt,如其他答案中所述),但您可以添加它:

implicit class QuotRem[T: Integral](x: T) {
  def /%(y: T) = (x / y, x % y)
}
Run Code Online (Sandbox Code Playgroud)

适用于所有整体类型.您可以通过为每种类型创建单独的类来提高性能,例如

implicit class QuotRemInt(x: Int) extends AnyVal {
  def /%(y: Int) = (x / y, x % y)
}
Run Code Online (Sandbox Code Playgroud)

  • 你当然可以做`val z = x/y; (z,x - z*y)`以避免`mod`,但最终可能会变慢. (2认同)

elm*_*elm 5

BigInt,注意/%操作,它提供与分区和提醒的对(见API).请注意例如

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)
Run Code Online (Sandbox Code Playgroud)

其中第二实例涉及从隐式转换IntBigInt.