2012-02-24 828 views
3

我正在运行一个奇怪的java错误,使用BigDecimal类中的intValue()。BigDecimal.intValue()返回意想不到的数字

我开始与3300028000.

当我调用下面的代码值:

int i = d.intValue(); 

返回:-994939296

任何的IDE,为什么会发生这种情况?

回答

3

当你试图将这个数字放入一个int变量时,它会溢出,因为Java中的int类型有32位,所以如果一个int变量可以存储范围从-2,147,483,648到2,147,483,647的值。

要存储BigInteger的值,必须使用long变量。试试这个:

long value = d.longValue(); 
+1

'longValue'存在同样的问题,仅供参考,它只是需要更大的值,然后才开始看到溢出。 – 2012-02-24 19:53:11

+0

正确。要将您的值存储在长变量中,您需要确保它不会超过签名的64位。如果您的BigInteger值可以并且将大于64位,则应将其保存到BigValue对象中。 – 2012-02-24 19:57:05

+0

什么是BigValue? – 2012-02-24 21:58:18

4

int不能保存一个很大的值,所以会溢出。尝试使用很长时间。

1

你真的应该责备之前阅读Java API

将此BigDecimal转换为int。这种转换类似于 缩小原语从double到short的转换,如 The Java™Language Specification第5.1.3节中所定义:此BigDecimal的任何小数部分 将被丢弃,并且如果得到的结果为 “BigInteger”也是大到适合int,只返回低位32位 。请注意,此转换可能会丢失有关此BigDecimal值的整体大小和精度的信息,以及 会返回相反符号的结果。

2

您想要返回什么? :)

javadocs描述:

如果生成的 “BigInteger” 太大而不适合用int,只有 低阶32位被返回

intValueExact另一方面,会抛出一个例外。

0

我不知道你为什么需要BigDecimal的int值,但类BigDecimal包含很多方法来满足你的请求。

compareTo 
add 
substract 
multiply 
divide 

等。

我会用自己的BigDecimal工作。迟早;将BigDecimal类型转换为其他基元类型最终会出现错误。因为他们都有限制。

相关问题