Ответы:
А Double
не является Integer
, поэтому актерский состав не будет работать. Обратите внимание на разницу между Double
классом и double
примитивом . Также обратите внимание, что a Double
является a Number
, поэтому у него есть метод intValue
, который можно использовать для получения значения в качестве примитива int
.
intValue()
тогда.
intValue()
, он просто double
приводит к int
.
Вам нужно явно получить значение int, используя метод intValue (), например:
Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
Или
double d = 5.25;
int i = (int) d;
2^31 - 1 (Integer.MAX_VALUE)
будет переполнено.
1.6 -> 1
, 1.4 -> 1
, -1.6 -> -1
, -1.4 -> -1
,
Я думаю, что невозможно понять другие ответы, не скрывая ошибок и рассуждений .
Вы не можете напрямую привести объект Integer
к Double
объекту. Также Double
иInteger
являются неизменяемыми объектами, поэтому вы не можете их никоим образом изменять.
Каждый числовой класс имеет примитивную альтернативу ( Double
vs double
, Integer
vs int
, ...). Обратите внимание, что эти примитивы начинаются со строчной буквы (например, int
). Это говорит нам о том, что они не являются классами / объектами. Что также означает, что у них нет методов. В отличие от классов (например,Integer
) действуют как коробки / оболочки вокруг этих примитивов, что позволяет использовать их как объекты.
Чтобы преобразовать a Double
в a Integer
вам нужно следовать этой стратегии:
Double
объект в примитивdouble
. (= "распаковка")double
в примитивint
. (= "кастинг")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 также может содержать «специальные значения», которые целые числа не могут:
Поэтому, в зависимости от приложения, вы можете захотеть добавить фильтрацию, чтобы избежать неприятных исключений.
Тогда следующим недостатком является стратегия округления. По умолчанию 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);
Вы могли бы испытать желание использовать авто (не) бокс в этом, но я бы не стал. Если вы уже застряли сейчас, то и следующие примеры не будут такими очевидными. Если вы не понимаете внутреннюю работу авто (не) бокса, то, пожалуйста, не используйте его.
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
Кроме того, не поддавайтесь искушению использовать new Integer()
конструктор (как предлагают некоторые другие ответы). Эти valueOf()
методы лучше , потому что они используют кэширование. Это хорошая привычка использовать эти методы, потому что время от времени они будут экономить память.
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
Я вижу три возможности. Первые две обрезают цифры, последние округляют до ближайшего целого числа.
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
Как это:
Double foo = 123.456;
Integer bar = foo.intValue();
Действительно, самый простой способ - это использовать 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, с относительной грацией.
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
Просто сделай это так ...
Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Double d = 100.00;
Integer i = d.intValue();
Следует также добавить, что он работает с автобоксом.
В противном случае вы получаете int (примитив), а затем можете получить Integer оттуда:
Integer i = new Integer(d.intValue());
new Integer(int)
, вместо этого используйте Integer.valueOf(int)
, который имеет кеш для маленьких целых чисел, таких как этот.
Вы можете сделать это, используя «Сужение или явное преобразование типов», 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. Но для других это сделает магию.
Попробуй это
double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Просто используйте метод intValue Double
Double initialValue = 7.12;
int finalValue = initialValue.intValue();
Память эффективна, так как будет разделять уже созданный экземпляр Double.
Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
Math.floor(...)
? intValue()
всегда полы в любом случае.
Это сработало для меня. Попробуй это:
double od = Double.parseDouble("1.15");
int oi = (int) od;