没有在Scala中找到BigInt的intValueExact

时间:2015-11-19 15:45:38

标签: scala math bigint

java.math.BigIntegerintValueExact之类的方法,如果出现溢出则抛出异常。 scala类scala.math.BigInt似乎没有这样的方法。

我应该这样做吗?

def intExact(num: BigInt): Int = if (num.isValidInt) num.toInt else // throw an exception

2 个答案:

答案 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