Java:将 double 转换为 int > Integer.MAX_VALUE

Java: Casting double to int > Integer.MAX_VALUE

我正在尝试解决 "Core Java for the Impatient" -

中的以下问题

"What happens when you cast a double to an int that is larger than the largest possible int value?"

代码:

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 的范围比 primitive int 更宽,所以不应该有溢出问题,什么是获得大于 [=30= 的 double 的正确方法]?

谢谢

简单地说:当您执行 double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1); 时,实际溢出的部分(作为整数,因此取负值)只是 Integer.MAX_VALUE + rand.nextInt((max - min) + 1),随后将其转换为 double。

表达式中:

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

表达式右侧会先将和赋给一个整数,然后将此结果转换为双精度型。由于向 Integer.MAX_VALUE 添加任何内容都会导致溢出,因此您最终会得到一个负数,因为符号位作为溢出的一部分被翻转。

如果你想要加倍,那么只需将 MAX_VALUE 转换为 double:

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

现在在这种情况下你得到了你想要的,因为你将一个随机数添加到一个双精度数,它承载最大的 int 值,它不接近双精度数可以存储的限制。

Demo

您的行没有将 2 部分转换为 double,然后对它们求和,而是对它们求和导致溢出,而​​您只是将它们放入 double

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