2012-02-24 829 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類型轉換爲其他基元類型最終會出現錯誤。因爲他們都有限制。

相關問題