簡體   English   中英

Java:將double轉換為int> Integer.MAX_VALUE

[英]Java: Casting double to int > Integer.MAX_VALUE

我正在嘗試從“不耐煩的Java核心”中解決以下問題-

“如果將double轉換為大於可能的最大int值的int,會發生什么?”

碼:

package ch01.sec01;
import java.util.Random;

public class Exercise_5{
    public static void main(String[] args){
        int max = 10000;
        int min = 1000; 
        Random rand = new Random(); 
        double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);
        System.out.println("randomDouble: " +randomDouble);
        int intFromDouble = (int)randomDouble;
        System.out.println("intFromDouble: " +intFromDouble); 
    }
}

輸出:

randomDouble: -2.147475257E9
intFromDouble: -2147475257

我想知道為什么randomDouble取負值,因為primitve double的范圍比原始int的范圍大,因此應該沒有溢出問題,而獲得比Integer.MAX_VALUE大的double的正確方法是什么?

謝謝

在表達式中:

double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);

表達式的右側將首先將和分配為整數,然后將結果轉換為雙精度。 由於向Integer.MAX_VALUE添加任何內容都會導致溢出,因此您最終會得到一個負數,因為符號位在溢出過程中會被翻轉。

如果您想加倍,則只需將MAX_VALUEdouble

double randomDouble = (double)Integer.MAX_VALUE + (double)rand.nextInt((max - min) + 1);

現在,在這種情況下,您將獲得所需的內容,因為您要在double中添加一個隨機數,該double具有最大的int值,該值不接近double可以存儲的限制。

演示版

簡而言之:當執行double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1); 實際上溢出的部分(作為Integer,因此取負值)只是Integer.MAX_VALUE + rand.nextInt((max - min) + 1) ,隨后將其轉換為兩倍。

您的行沒有將2的部分強制轉換為double,然后將它們相加,但是將它們相加會導致溢出,而​​您只是將它們放入double

double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM