Java: приведение double к int> Integer.MAX_VALUE - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь выполнить следующую задачу из «Базовой Java для нетерпеливых» -

"Что происходит, когда вы разыгрываете двойное значение для типа 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, и поэтому не должно быть проблем с переполнением, и какой будет правильный способ получить double больше, чем Integer.MAX_VALUE?

Спасибо

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

В выражении:

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, которое не приближается к пределу для того, что может хранить двойное число.

Демо

0 голосов
/ 26 июня 2018

В вашей строке 2 части не удваиваются как двойные, а затем суммируются, но суммируются, что приводит к переполнению, а вы просто помещаете двойные

double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1);
0 голосов
/ 26 июня 2018

Проще говоря: когда вы выполняете double randomDouble = Integer.MAX_VALUE + rand.nextInt((max - min) + 1); часть, которая фактически переполняется (как целое число, принимая, таким образом, отрицательное значение), это просто Integer.MAX_VALUE + rand.nextInt((max - min) + 1), который впоследствии приводится к удвоению.

...