Вставить Double в Integer в Java

Как передать java.lang.Double на java.lang.Integer?

Выдает исключение

"java.lang.ClassCastException: java.lang.Double несовместим с java.lang.Integer"

Ответ 1

A Double не является Integer, поэтому приведение не будет работать. Обратите внимание на разницу между Double классом и примитивом Double . Также обратите внимание, что Double является Number, поэтому он имеет метод intValue, когда вы можете использовать для получения примитива int.

Ответ 2

Вам нужно явно получить значение int с помощью метода intValue() следующим образом:

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

Или

double d = 5.25;
int i = (int) d;

Ответ 3

Я вижу три возможности. Первые два отсекают цифры, последний округляется до ближайшего целого.

double d = 9.5;
int i = (int)d;
//i = 9

Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9

double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10

Ответ 4

Я думаю, что невозможно понять другие ответы, не покрывая подводных камней и рассуждений позади него.

Вы не можете напрямую преобразовать Integer непосредственно в объект Double. Также Double и Integer являются неизменяемыми объектами, поэтому вы никак не можете их модифицировать. Однако у каждого числового класса есть примитивная альтернатива (Double vs double, Integer vs int,...).

Таким образом, стратегия должна быть:

  • Преобразуйте двойной объект в примитивный двойной. (= "unboxing" )
  • Преобразование примитивного двойника в примитивный int. (= "casting" )
  • Преобразуйте примитивное целое обратно в объект Integer. (= "бокс" )

В Java:

// starting point
Double myDouble = Double.valueOf(10.0);

// step 1: unboxing
double dbl = myDouble.doubleValue();

// step 2: casting
int intgr = (int) dbl;

// step 3: boxing
Integer val = Integer.valueOf(intgr);

На самом деле есть ярлык. Вы можете немедленно удалить из Double прямо в примитив int. Таким образом, вы можете полностью пропустить шаг 2.

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way

Тем не менее, есть много вещей, которые не рассматриваются в приведенном выше коде. Приведенный выше код не является нулевым.

Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException

// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());

Теперь он отлично подходит для большинства значений. Однако целые числа имеют очень малый диапазон (минимальное/максимальное значение) по сравнению с Double. Кроме того, Doubles могут также содержать "специальные значения", которые не могут: целые числа:

  • 1/0 = + бесконечность
  • -1/0 = -infinity
  • 0/0 = undefined (NaN)

Итак, в зависимости от приложения вы можете добавить некоторую фильтрацию, чтобы избежать неприятных исключений.

Тогда следующий недостаток - стратегия округления. По умолчанию Java всегда будет округлять. Округление имеет смысл во всех языках программирования. В основном Java просто отбрасывает некоторые из байтов. В финансовых приложениях вы обязательно захотите использовать экономичное округление (например: round(0.5) = 1 и round(0.4) = 0).

// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);

У вас может возникнуть соблазн использовать авто-(un) бокс в этом, но я бы не стал. Если вы уже застряли сейчас, то следующее не будет так очевидно. Если вы не понимаете внутреннюю работу авто- (un) бокса, пожалуйста, не используйте его.

Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work

Double val3 = 10; // doesn't work
Double val4 = 10.0; // works

Double val5 = null; 
double val6 = val5; // doesn't work

Думаю, следующее не должно быть неожиданностью. Но если это так, то вы можете прочитать статью о кастинге на Java.

double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense

Кроме того, не возникает соблазна использовать конструктор new Integer() (как предлагают некоторые другие ответы). Методы valueOf() лучше, потому что они используют кеширование. Это хорошая привычка использовать эти методы, потому что время от времени они сэкономит вам некоторую память.

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory

Ответ 5

Вот так:

Double foo = 123.456;
Integer bar = foo.intValue();

Ответ 6

Действительно, самый простой способ - использовать intValue(). Однако это просто возвращает целочисленную часть; он не делает никакого округления. Если вы хотите, чтобы Integer был ближе к двойному значению, вам нужно сделать следующее:

Integer integer = Integer.valueOf((int) Math.round(myDouble)));

И не забывайте нулевой случай:

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));

Math.round() обрабатывает нечетные случаи утки, такие как бесконечность и NaN, с относительной грацией.

Ответ 7

double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13

Ответ 8

Double d = 100.00;
Integer i = d.intValue();

Следует также добавить, что он работает с автобоксированием.

В противном случае вы получите int (примитив), а затем можете получить Integer:

Integer i = new Integer(d.intValue());

Ответ 9

Просто сделайте это так...

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);

Ответ 10

Вызовите intValue() на свой Double объект.

Ответ 11

Double и Integer - это классы-оболочки для примитивов Java для double и int соответственно. Вы можете бросить между ними, но вы потеряете плавучую точку. То есть, 5.4, отправленный в int, будет 5. Если вы вернете его, оно будет 5.0.

Ответ 12

Вы можете сделать это, используя "Сужение или Явное преобразование типа", double → long → int. Я надеюсь, что это сработает.

double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l;    // Explicit type casting required

PS: он даст 0, так как double имеет все десятичные значения и ничего с левой стороны. В случае 0.58 он будет сузить его до 0. Но для других он будет делать магию.

Ответ 13

Используйте метод doubleNumber.intValue();.

Ответ 14

Просто используйте метод intValue Double

Double initialValue = 7.12;
int finalValue = initialValue.intValue();

Ответ 15

Попробуйте этот

double doubleValue = 6.5; Double doubleObj = new Double (doubleValue); int intResult = doubleObj.intValue();