Как передать java.lang.Double
на java.lang.Integer
?
Выдает исключение
"java.lang.ClassCastException: java.lang.Double несовместим с java.lang.Integer"
Как передать java.lang.Double
на java.lang.Integer
?
Выдает исключение
"java.lang.ClassCastException: java.lang.Double несовместим с java.lang.Integer"
A Double
не является Integer
, поэтому приведение не будет работать. Обратите внимание на разницу между Double
классом и примитивом Double
. Также обратите внимание, что Double
является Number
, поэтому он имеет метод intValue
, когда вы можете использовать для получения примитива int
.
Вам нужно явно получить значение int с помощью метода intValue() следующим образом:
Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
Или
double d = 5.25;
int i = (int) d;
Я вижу три возможности. Первые два отсекают цифры, последний округляется до ближайшего целого.
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
Я думаю, что невозможно понять другие ответы, не покрывая подводных камней и рассуждений позади него.
Вы не можете напрямую преобразовать Integer непосредственно в объект Double. Также Double и Integer являются неизменяемыми объектами, поэтому вы никак не можете их модифицировать. Однако у каждого числового класса есть примитивная альтернатива (Double vs double, Integer vs int,...).
Таким образом, стратегия должна быть:
В 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 могут также содержать "специальные значения", которые не могут: целые числа:
Итак, в зависимости от приложения вы можете добавить некоторую фильтрацию, чтобы избежать неприятных исключений.
Тогда следующий недостаток - стратегия округления. По умолчанию 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
Вот так:
Double foo = 123.456;
Integer bar = foo.intValue();
Действительно, самый простой способ - использовать intValue()
. Однако это просто возвращает целочисленную часть; он не делает никакого округления. Если вы хотите, чтобы Integer был ближе к двойному значению, вам нужно сделать следующее:
Integer integer = Integer.valueOf((int) Math.round(myDouble)));
И не забывайте нулевой случай:
Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Math.round()
обрабатывает нечетные случаи утки, такие как бесконечность и NaN, с относительной грацией.
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
Double d = 100.00;
Integer i = d.intValue();
Следует также добавить, что он работает с автобоксированием.
В противном случае вы получите int (примитив), а затем можете получить Integer:
Integer i = new Integer(d.intValue());
Просто сделайте это так...
Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Вызовите intValue()
на свой Double
объект.
Double и Integer - это классы-оболочки для примитивов Java для double и int соответственно. Вы можете бросить между ними, но вы потеряете плавучую точку. То есть, 5.4, отправленный в int, будет 5. Если вы вернете его, оно будет 5.0.
Вы можете сделать это, используя "Сужение или Явное преобразование типа", 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. Но для других он будет делать магию.
Используйте метод doubleNumber.intValue();
.
Просто используйте метод intValue Double
Double initialValue = 7.12;
int finalValue = initialValue.intValue();
Попробуйте этот
double doubleValue = 6.5; Double doubleObj = new Double (doubleValue); int intResult = doubleObj.intValue();