繁体   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