2015-12-05 4 views

ответ

5

Нет (за исключением 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) 
} 
+1

С точки зрения оптимизации оба 'divison' и' mod' - это дорогостоящая операция, и мы выполняем их оба. Есть ли способ взять оба результата с одним процессом? – Rumoku

+0

Один, который работает для всех 'Integral'' T' ('Int',' Long', 'BigInt' и т. Д.)? Нет. Может ли это быть сделано для 'Int' или для' Long' конкретно, следует задать в отдельном вопросе; но если это возможно, я не удивлюсь, если компилятор сделает это автоматически. –

+2

Вы можете, конечно, сделать 'val z = x/y; (z, x - z * y) ', чтобы избежать« моды », но в конечном итоге он может быть медленнее. –

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) 

где второй пример включает неявное преобразование из Int к BigInt.

+1

Вл. ** НЕ ** рассматривайте возможность делать это с помощью целых чисел, если вы не можете терпеть математику в 60 раз медленнее, чем обычно (отдельный вызов% и /)! –

+0

Существует более хорошее решение на основе неявного. Это приводит к неправильному типу результата, выполняет ужасно и позволяет вызывать другие нежелательные методы в 'Int'. –

0

BigInt делает это

def /%(that: BigInt): (BigInt, BigInt) 

Division и остаток - возвращает кортеж, содержащий результат divideToIntegralValue и остатка.

5

Немного поздно к игре, но так как Scala 2.8 это работает:

import scala.math.Integral.Implicits._ 

val (quotient, remainder) = 5 /% 2