Приведите Double к Integer в Java - PullRequest
       36

Приведите Double к Integer в Java

325 голосов
/ 01 февраля 2012

Любой способ разыграть java.lang.Double на java.lang.Integer?

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

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

Ответы [ 17 ]

536 голосов
/ 01 февраля 2012

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

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

или

double d = 5.25;
int i = (int) d;
435 голосов
/ 01 февраля 2012

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

43 голосов
/ 27 октября 2014

Я думаю, что невозможно понять другие ответы без учета ловушек и аргументации за этим.

Вы не можете напрямую привести Integer к Double объекту. Также Double и Integer являются неизменяемыми объектами, поэтому вы не можете их изменять каким-либо образом.

Каждый числовой класс имеет альтернативу примитив (Double против double, Integer против int, ...). Обратите внимание, что эти примитивы начинаются со строчной буквы (например, int). Это говорит нам о том, что они не являются классами / объектами. Что также означает, что у них нет методов. Напротив, классы (например, Integer) действуют как коробки / обертки вокруг этих примитивов, что позволяет использовать их как объекты.

Стратегия:

Чтобы преобразовать Double в Integer, вам необходимо придерживаться этой стратегии:

  1. Преобразовать объект Double в примитив double. (= "распаковка")
  2. Преобразовать примитив double в примитив int. (= "кастинг")
  3. Преобразовать примитив int обратно в Integer объект. (= "бокс")

В коде:

// 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. Кроме того, double также может содержать «специальные значения», которые не могут быть целыми числами:

  • 1/0 = + бесконечность
  • -1 / 0 = -infinity
  • 0/0 = не определено (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);

Автомототехника (ип) бокс

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

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 (throws a NullPointerException)

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

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

Предпочтительное значениеOf:

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

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
37 голосов
/ 15 ноября 2013

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

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
22 голосов
/ 18 июля 2014

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

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

И не забывайте нулевой регистр:

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

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

21 голосов
/ 02 февраля 2012

Как это:

Double foo = 123.456;
Integer bar = foo.intValue();
13 голосов
/ 11 марта 2013
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13
7 голосов
/ 01 марта 2015

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

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
6 голосов
/ 04 декабря 2013
Double d = 100.00;
Integer i = d.intValue();

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

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

Integer i = new Integer(d.intValue());
5 голосов
/ 31 июля 2016

Позвоните intValue() на ваш Double объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...