Проверить, что значение double меньше максимального значения типа int - PullRequest
0 голосов
/ 26 марта 2019

Предположим, что d является переменной double. Напишите оператор if, который присваивает d переменной int i, если значение в d не превышает максимальное значение для int.

Метод, описанный ниже, является моей попыткой решить эту проблему:

public static void assignInt(double d)
{
  int i = 0;
  if(d < Integer.MAX_VALUE)
    i =  (int)d;
  System.out.print(i);
}

Integer.MAX_VALUE содержит 2147483647. Я предполагаю, что это максимальное значение, которое может содержать int? Имея это в виду, я пытаюсь вызвать assingDoubleToInt() три раза:

public static void main(String[] args)
{
  assignDoubleToInt(2147483646); //One less than the maximum value an int can hold
  assignDoubleToInt(2147483647); //The maximum value an int can hold
  assignDoubleToInt(2147483648);//One greater than the maximum value an int can hold. Causes error and does not run.
}

Вывод первых двух вызовов:

2147483646
0

И третий вызов, assignDoubleToInt(2147483648);, бросает "The literal 2147483648 of type int is out of range." Разве здесь не сравнение 2147483648 < 2147483647? Почему i присваивается значение, если сравнение должно оценивать false?

Использование сравнения d < Integer.MAX_VALUE - неправильный способ сделать это. Как проверить, может ли переменная double соответствовать переменной int?

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Проблема диапазона int заключается в том, что у вас есть литерал int. Используйте двойной литерал с постфиксом 'd':

public static void main(String[] args) {
    assignDoubleToInt(2147483646); // One less than the maximum value an int can hold
    assignDoubleToInt(2147483647); // The maximum value an int can hold
    assignDoubleToInt(2147483648d);// One greater than the maximum value an int can hold. Causes error and does not
                                  // run.
}

Я полагаю, что ваш тест на равенство должен быть <=, а также: «если значение в d не больше максимального значения для целого числа» - так что, если оно равно РАВНОМУ максимальному значению для целого числа, оно действительно:

public static void assignDoubleToInt(double d) {
    int i = 0;
    if (d <= Integer.MAX_VALUE)
        i = (int) d;
    System.out.println(i);
}
0 голосов
/ 26 марта 2019

Integer.MAX_VALUE содержит 2147483647.Я предполагаю, что это максимальное значение, которое может содержать int?

Да.

throws "The literal 2147483648 of type int is out of range."

Невозможно создать литерал int, представляющий число вне *Диапазон 1015 *, поэтому 2147483647 допустим, а 2147483648 - нет.Если вы хотите больший целочисленный литерал, используйте длинный литерал с добавленной буквой L: 2147483648L или двойной литерал с десятичной точкой (или с добавленным D): 2147483648.0 (или 2147483648D).

- неправильный способ сделать это.

Сравнение d < Integer.MAX_VALUE допустимо и корректно , потому что Integer.MAX_VALUE будет увеличено до double для сравнения, а double может быть (много) больше, чем Integer.MAX_VALUE.Вам просто нужно убедиться, что вы можете передать правильное значение, как описано выше.

(Как отмечено в комментарии выше, оно должно быть d <= Integer.MAX_VALUE, с <=.)

...