java.math.BigInteger
有像intValueExact
这样的方法,它会在溢出时引发异常。斯卡拉类scala.math.BigInt
似乎没有这样的方法。在Scala中找不到BigInt的intValueExact
我应该这样做吗?
def intExact(num: BigInt): Int = if (num.isValidInt) num.toInt else // throw an exception
java.math.BigInteger
有像intValueExact
这样的方法,它会在溢出时引发异常。斯卡拉类scala.math.BigInt
似乎没有这样的方法。在Scala中找不到BigInt的intValueExact
我应该这样做吗?
def intExact(num: BigInt): Int = if (num.isValidInt) num.toInt else // throw an exception
scala.math.BigInt只是围绕java.math.BigInteger的瘦包装。所以,你可以做的,没有任何性能以下(上Java8)问题
scala> val x: BigInt = 1
x: BigInt = 1
scala> x.bigInteger.intValueExact
res0: Int = 1
假设你与此抛出异常确定。否则,请使用@jazmit建议的内容。
注意:如果你想要一个非常快的任意精度整数,我会推荐使用spire.math.SafeLong。只要数量足够小,它就会在引擎盖下使用Long,所以在许多常见情况下它会非常快速。
SafeLong有一个方法isValidLong来检查值是否适合长期。
这是完全正确的事情..如果你想在失败时抛出异常。该“斯卡拉”的方式做事情就会返回一个选项,这样可以处理的错误在一个功能更强大的方式:
def intExact(num: BigInt): Option[Int] = if (num.isValidInt) Some(num.toInt) else None