亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 double 到 int 轉換在 java 中不能按預期工作?

為什么 double 到 int 轉換在 java 中不能按預期工作?

慕妹3146593 2023-09-27 14:39:12
我已經開始閱讀 Java8 的文檔并嘗試了不同的示例代碼。發現以下奇怪的行為。樣品1Double di = new Double(Math.pow(2,32-1));System.out.printf("%f\n",di.doubleValue()); //2147483648.000000int a= di.intValue();System.out.println(a); //2147483647樣品2Double di = new Double(Math.pow(2,32-1)) - 1.0;System.out.printf("%f\n",di.doubleValue()); //2147483647.000000int a= di.intValue();System.out.println(a); //2147483647為什么在這兩種情況下,int 值返回相同的值?
查看完整描述

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。


查看完整回答
反對 回復 2023-09-27
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

int這是因為Java 中類型的最大值是2147483647。當您調用時,Double::doubleValue如果您嘗試轉換的值超出范圍并且此方法的文檔中有說明,它將執行縮小轉換:

在縮小基元轉換后,以 int 形式返回此 Double 的值。

它甚至指向JLS 5.1.3,其中描述了這種縮小轉換。

轉換浮點值需要兩個步驟。第一步、第三點、選項 b 的句子中解釋了您看到此值的原因:

該值必須太大(大幅度的正值或正無窮大),并且第一步的結果是 int 或 long 類型的最大可表示值。

浮點數到整型 T 的縮小轉換需要兩個步驟:

  1. 第一步,如果 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。


查看完整回答
反對 回復 2023-09-27
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

int值不能超過Integer.MAX_VALUE,即2147483647當調用intValue()時,您自愿放棄所有尾部。



查看完整回答
反對 回復 2023-09-27
  • 3 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號