在 Scala 中找不到 BigInt 的 intValueExact
Didn't find intValueExact for BigInt in Scala
java.math.BigInteger
有类似 intValueExact
的方法,在溢出的情况下会抛出异常。 scalaclassscala.math.BigInt
好像没有这样的方法
我应该这样做吗?
def intExact(num: BigInt): Int = if (num.isValidInt) num.toInt else // throw an exception
这正是正确的做法.. 如果您想在失败时抛出异常。 'scala' 做事的方式是 return 一个选项,以便可以以更实用的方式处理错误:
def intExact(num: BigInt): Option[Int] = if (num.isValidInt) Some(num.toInt) else None
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 来检查值是否适合 long。
java.math.BigInteger
有类似 intValueExact
的方法,在溢出的情况下会抛出异常。 scalaclassscala.math.BigInt
好像没有这样的方法
我应该这样做吗?
def intExact(num: BigInt): Int = if (num.isValidInt) num.toInt else // throw an exception
这正是正确的做法.. 如果您想在失败时抛出异常。 'scala' 做事的方式是 return 一个选项,以便可以以更实用的方式处理错误:
def intExact(num: BigInt): Option[Int] = if (num.isValidInt) Some(num.toInt) else None
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 来检查值是否适合 long。