为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

收到一只叮咚 2021-04-19 10:17:06
我正在尝试从“不耐烦的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.147475257E9intFromDouble: -2147475257我想知道为什么randomDouble取负值,因为primitve double的范围比原始int的范围大,因此应该没有溢出问题,而获得比Integer.MAX_VALUE大的double的正确方法是什么?
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

在表达式中:

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可以存储的限制。


查看完整回答
反对 回复 2021-04-28
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

您的行没有将2的部分强制转换为double,然后将它们相加,但是将它们相加会导致溢出,而您只是将它们放入double

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


查看完整回答
反对 回复 2021-04-28
  • 3 回答
  • 0 关注
  • 235 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信