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 值,它不接近双精度数可以存储的限制。
您的行没有将 2 部分转换为 double,然后对它们求和,而是对它们求和导致溢出,而您只是将它们放入 double
double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);
我正在尝试解决 "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 值,它不接近双精度数可以存储的限制。
您的行没有将 2 部分转换为 double,然后对它们求和,而是对它们求和导致溢出,而您只是将它们放入 double
double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);