it-swarm.com.ru

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

Есть ли способ привести Java.lang.Double к Java.lang.Integer

Это исключение 

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

313
4lex1v

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

426
hvgotcodes

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

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

Или же 

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

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

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

Каждый числовой class имеет альтернативу primitive (Double vs double, Integer vs 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

Предпочитаю valueOf:

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

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

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

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
37
squit

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

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

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

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

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

21
Michael Scheper

Как это: 

Double foo = 123.456;
Integer bar = foo.intValue();
20
Richard Schwartz
double a = 13.34;
int b = (int) a;

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

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

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
6
Sunil Sharma
Double d = 100.00;
Integer i = d.intValue();

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

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

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

Вызовите intValue() для вашего объекта Double.

5
Alejandro Pablo Tkachuk

Попробуй это

double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
3
Samantha de Silva

Вы можете сделать это, используя «Сужение или явное преобразование типов», 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. Но для других это сделает магию.

3
Sarthak Bhatia

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

2
OnResolve

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

0
PanTau

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

Double initialValue = 7.12;
int finalValue = initialValue.intValue();
0
ravi ranjan

Память эффективна, так как будет разделять уже созданный экземпляр Double.

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
0
Ravinder Payal