3 回答

TA貢獻1777條經驗 獲得超3個贊
請參閱https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3最后以粗體突出顯示的重要部分:
浮點數到整型 T 的縮小轉換需要兩個步驟:
第一步,如果 T 為 long,則浮點數轉換為 long;如果 T 為 byte、short、char 或 int,則浮點數轉換為 int,如下所示:
如果浮點數為 NaN(第 4.2.3 節),則第一步轉換的結果為 int 或 long 0。
否則,如果浮點數不是無窮大,則浮點值將四舍五入為整數值 V,使用 IEEE 754 向零舍入模式(第 4.2.3 節)向零舍入。那么有兩種情況:
如果T是long,并且這個整數值可以表示為long,那么第一步的結果就是long值V。
否則,如果這個整數值可以表示為int,那么第一步的結果就是int值V。
否則,必須滿足以下兩種情況之一:
該值必須太?。ù蠓鹊呢撝祷蜇摕o窮大),并且第一步的結果是 int 或 long 類型的最小可表示值。
該值必須太大(大幅度的正值或正無窮大),并且第一步的結果是 int 或 long 類型的最大可表示值。
也就是說,你的雙精度值是 2147483648 (你可以嘗試使用更大的數字)。int int 的最高可表示值是 2147483647。這就是為什么你最終得到 2147483647。

TA貢獻1828條經驗 獲得超3個贊
int
這是因為Java 中類型的最大值是2147483647
。當您調用時,Double::doubleValue
如果您嘗試轉換的值超出范圍并且此方法的文檔中有說明,它將執行縮小轉換:
在縮小基元轉換后,以 int 形式返回此 Double 的值。
它甚至指向JLS 5.1.3,其中描述了這種縮小轉換。
轉換浮點值需要兩個步驟。第一步、第三點、選項 b 的句子中解釋了您看到此值的原因:
該值必須太大(大幅度的正值或正無窮大),并且第一步的結果是 int 或 long 類型的最大可表示值。
浮點數到整型 T 的縮小轉換需要兩個步驟:
第一步,如果 T 為 long,則浮點數轉換為 long;如果 T 為 byte、short、char 或 int,則浮點數轉換為 int,如下所示:
如果浮點數為 NaN(第 4.2.3 節),則第一步轉換的結果為 int 或 long 0。
否則,如果浮點數不是無窮大,則浮點值將四舍五入為整數值 V,使用 IEEE 754 向零舍入模式(第 4.2.3 節)向零舍入。那么有兩種情況:
a如果T是long,并且這個整數值可以表示為long,那么第一步的結果就是long值V。
b否則,如果這個整數值可以表示為int,那么第一步的結果就是int值V。
否則,必須滿足以下兩種情況之一:
a值必須太小(大幅度的負值或負無窮大),并且第一步的結果是 int 或 long 類型的最小可表示值。
b?該值必須太大(大幅度的正值或正無窮大),并且第一步的結果是 int或 long 類型的最大可表示值。
在第二步中:
如果T是int或者long,轉換的結果就是第一步的結果。
如果 T 是字節、字符或短整型,則轉換結果是第一步結果縮小轉換為類型 T(第 5.1.3 節)的結果。
因此,在這種情況下,結果將是 type 的最大可表示值int
。
添加回答
舉報