2015-11-19 25 views
2

java.math.BigInteger有像intValueExact這樣的方法,它會在溢出時引發異常。斯卡拉類scala.math.BigInt似乎沒有這樣的方法。在Scala中找不到BigInt的intValueExact

我應該這樣做嗎?

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

回答

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

這是完全正確的事情..如果你想在失敗時拋出異常。該「斯卡拉」的方式做事情就會返回一個選項,這樣可以處理的錯誤在一個功能更強大的方式:

def intExact(num: BigInt): Option[Int] = if (num.isValidInt) Some(num.toInt) else None