java.math.BigInteger
有intValueExact
之类的方法,如果出现溢出则抛出异常。 scala类scala.math.BigInt
似乎没有这样的方法。
我应该这样做吗?
def intExact(num: BigInt): Int = if (num.isValidInt) num.toInt else // throw an exception
答案 0 :(得分:5)
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来检查该值是否适合长整数。
答案 1 :(得分:1)
这是正确的做法..如果你想在失败时抛出异常。 “scala”做事的方法是返回一个选项,以便以更实用的方式处理错误:
def intExact(num: BigInt): Option[Int] = if (num.isValidInt) Some(num.toInt) else None