scala - 常见的做法是如何处理Integer溢出?

标签 scala biginteger integer-overflow

应用程序开发团队的角度来看,如何处理诸如999999 * 999999(结果> Integer.MAX_VALUE)之类的整数溢出?

可以使BigInt成为强制性的,并禁止使用Integer,但这是一个好/坏主意吗?

最佳答案

如果整数不溢出非常重要,则可以定义自己的溢出捕捉操作,例如:

def +?+(i: Int, j: Int) = {
  val ans = i.toLong + j.toLong
  if (ans < Int.MinValue || ans > Int.MaxValue) {
    throw new ArithmeticException("Int out of bounds")
  }
  ans.toInt
}

您可能可以使用“丰富您的图书馆”模式将其转变为运算符;如果JVM能够正确地进行转义分析,那么您将不会受到太多的惩罚:
class SafePlusInt(i: Int) {
  def +?+(j: Int) = { /* as before, except without i param */ }
}
implicit def int_can_be_safe(i: Int) = new SafePlusInt(i)

例如:
scala> 1000000000 +?+ 1000000000
res0: Int = 2000000000

scala> 2000000000 +?+ 2000000000
java.lang.ArithmeticException: Int out of bounds
    at SafePlusInt.$plus$qmark$plus(<console>:12)
    ...

如果不是很重要,那么在大多数情况下,标准的单元测试和代码审查等应可以解决该问题。可以使用BigInt,但会使您的算术速度降低100倍左右,并且在必须使用采用Int的现有方法时将无济于事。

关于scala - 常见的做法是如何处理Integer溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9874999/

相关文章:

scala - 需要两个参与者才能完成的 Akka/Scala promise

scala - 在 spark 中读取 csv 文件时出现 ArrayIndexOutOfBoundsException

scala - 如何在 Scala XML 解析中处理 nil?

java - 在 Java 中如何将二进制数转换为 BigInteger?

java算术

scala - sbt 失败,出现 java.lang.NoClassDefFoundError : sbt/ConsoleOut$

java - 为什么我的 Biginteger.multiply() 显示 NullPointerException?

java - 将 BigInteger 转换为 int 数组的更快方法是什么?

Haskell 长度列表 + 阶乘

python - 在 Python 中启用整数溢出