我正在尝试从“不耐烦的Core 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的正确方法是什么?>
谢谢
答案 0 :(得分:3)
在表达式中:
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);
现在,在这种情况下,您将获得所需的内容,因为您要向double中添加一个随机数,该double具有最大的int值,该值不接近double可以存储的限制。
答案 1 :(得分:1)
简单地说:执行double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);
时实际溢出的部分(作为整数,因此取负值)只是Integer.MAX_VALUE + rand.nextInt((max - min) + 1)
,随后将其转换为两倍。
答案 2 :(得分:1)
您的行没有将2的部分强制转换为double,然后将它们加和,但是将它们相加会导致溢出,而您只是将它们放入double中
double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);