BigInteger::intValueExact() - 有什么用处?

10
我注意到在Java 8中,类 BigInteger 新增了一个方法: intValueExact()

我的问题是:为什么?

BigInteger bigInt = ... ;

bigInt.intValueExact();
BigInteger已经有intValue()方法。 intValueExact()的目的是在您的BigInteger不持有精确的int值时抛出错误,但我的问题是:如何可能为BigInteger赋予一个不等于精确int的值?有人能提供一个例子,说明这个方法何时会抛出ArithmeticException吗?

2
如果 BigInteger 太大而无法适应 int,该怎么办? - Mysticial
3
BigInteger.valueOf(Integer.MAX_VALUE).add(BigInteger.ONE) BOOM 的翻译: BigInteger.valueOf(Integer.MAX_VALUE).add(BigInteger.ONE) 意为将整数最大值转换成大整数类型并加一,当结果超出了大整数类型的范围时会导致计算错误。 - yshavit
1
这里有一个问题。如果 BigInteger 不能容纳比 int 更大的值,那么使用 BigInteger 的意义是什么? - Cole Tobin
@ColeJohnson,BigInteger可以保存比int更大的值。@yshavit的评论是一个示例场景,当调用intValueExact()时会抛出错误,这也是原始问题所问的。 - ryvantage
@ryvanage 我看到了他的评论。我并没有回答 OP 的问题,而是提出了一个问题来让 OP “思考”。 - Cole Tobin
我在思考,@ColeJohnson。那是个愚蠢的问题。我现在明白了。 - ryvantage
3个回答

14

intValue() 方法仅保留适合 int 类型的最低32位,必要时将丢弃信息。

将此 BigInteger 转换为 int。此转换类似于 Java™ 语言规范第 5.1.3 节中定义的长整数到整数的缩小原始类型转换:如果此 BigInteger 太大而无法适合 int,则仅返回低阶32位。请注意,此转换可能会丢失有关 BigInteger 值的总体大小的信息,并返回相反符号的结果。

intValueExact() 方法将在这种情况下抛出异常,而不是给您一个不同的值。

将此 BigInteger 转换为 int,检查是否有丢失的信息。如果此 BigInteger 的值超出 int 类型的范围,则会抛出 ArithmeticException 异常。


13
new BigInteger("10000000000000000000000000000000000000000000000").intValueExact()

如果 BigInteger 太大而无法适应一个 int,则会抛出异常。


1
你觉得那是个大数字?哈!new BigInteger("BusyBeaver(9)"),现在这才是一个大数字! - yshavit
2
除了一个小问题,即该数字不可计算且我们不知道“BusyBeaver”的准确值(对于众多略有不同的定义而言),幸运的是,将字符串的13个代码单元解释为26字节整数可以得到一个远远超出“int”范围的整数。它仍然比这个答案中的数字大 :-) - user395760
1
@yshavit 你是不是想说你需要 import ChuckNorris;? ;) - Cole Tobin

1

来自文档

将此BigInteger转换为int,检查是否丢失信息。如果此BigInteger的值超出int类型的范围,则会抛出ArithmeticException。

因此,简单地说,如果BigInteger的值大于2 ^ 31 - 1,则会抛出ArithmeticException


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接