Любой способ привести java.lang.Double
к java.lang.Integer
?
Это исключение
"java.lang.ClassCastException: java.lang. Double несовместим с java.lang.Integer"
А Double
не является Integer
, поэтому актерский состав не будет работать. Обратите внимание на разницу между Double
классом и double
примитивом . Также обратите внимание, что a Double
является a Number
, поэтому у него есть метод intValue
, который можно использовать для получения значения в качестве примитива int
.
intValue()
тогда.intValue()
, он простоdouble
приводит кint
.Вам нужно явно получить значение int, используя метод intValue (), например:
Или
источник
2^31 - 1 (Integer.MAX_VALUE)
будет переполнено.1.6 -> 1
,1.4 -> 1
,-1.6 -> -1
,-1.4 -> -1
,Я думаю, что невозможно понять другие ответы, не скрывая ошибок и рассуждений .
Вы не можете напрямую привести объект
Integer
кDouble
объекту. ТакжеDouble
иInteger
являются неизменяемыми объектами, поэтому вы не можете их никоим образом изменять.Каждый числовой класс имеет примитивную альтернативу (
Double
vsdouble
,Integer
vsint
, ...). Обратите внимание, что эти примитивы начинаются со строчной буквы (например,int
). Это говорит нам о том, что они не являются классами / объектами. Что также означает, что у них нет методов. В отличие от классов (например,Integer
) действуют как коробки / оболочки вокруг этих примитивов, что позволяет использовать их как объекты.Стратегия:
Чтобы преобразовать a
Double
в aInteger
вам нужно следовать этой стратегии:Double
объект в примитивdouble
. (= "распаковка")double
в примитивint
. (= "кастинг")int
обратно вInteger
объект. (= "бокс")В коде:
На самом деле есть ярлык. Вы можете распаковать сразу с
Double
прямой на примитивint
. Таким образом, вы можете полностью пропустить шаг 2.Ловушки:
Тем не менее, есть много вещей, которые не охвачены в коде выше. Код выше не является нулевым.
Теперь он работает нормально для большинства значений. Однако целые числа имеют очень маленький диапазон (минимальное / максимальное значение) по сравнению с
Double
. Кроме того, double также может содержать «специальные значения», которые целые числа не могут:Поэтому, в зависимости от приложения, вы можете захотеть добавить фильтрацию, чтобы избежать неприятных исключений.
Тогда следующим недостатком является стратегия округления. По умолчанию Java всегда будет округляться. Округление вниз имеет смысл во всех языках программирования. По сути, Java просто отбрасывает некоторые байты. В финансовых приложениях вы наверняка захотите использовать округление до половины (например:
round(0.5) = 1
иround(0.4) = 0
).Автомототехника (ип) бокс
Вы могли бы испытать желание использовать авто (не) бокс в этом, но я бы не стал. Если вы уже застряли сейчас, то и следующие примеры не будут такими очевидными. Если вы не понимаете внутреннюю работу авто (не) бокса, то, пожалуйста, не используйте его.
Я думаю, что следующее не должно быть сюрпризом. Но если это так, то вы можете прочитать статью о приведении в Java.
Предпочитаю valueOf:
Кроме того, не поддавайтесь искушению использовать
new Integer()
конструктор (как предлагают некоторые другие ответы). ЭтиvalueOf()
методы лучше , потому что они используют кэширование. Это хорошая привычка использовать эти методы, потому что время от времени они будут экономить память.источник
Я вижу три возможности. Первые две обрезают цифры, последние округляют до ближайшего целого числа.
источник
Как это:
источник
Действительно, самый простой способ - это использовать
intValue()
. Однако это просто возвращает целочисленную часть; это не делает никакого округления. Если вы хотите, чтобы Integer ближайший к значению Double, вам нужно сделать это:И не забывайте нулевой случай:
Math.round()
обрабатывает странные случаи утки, как бесконечность и NaN, с относительной грацией.источник
источник
Просто сделай это так ...
источник
Следует также добавить, что он работает с автобоксом.
В противном случае вы получаете int (примитив), а затем можете получить Integer оттуда:
источник
new Integer(int)
, вместо этого используйтеInteger.valueOf(int)
, который имеет кеш для маленьких целых чисел, таких как этот.Звони
intValue()
на свойDouble
объект.источник
Вы можете сделать это, используя «Сужение или явное преобразование типов», double → long → int. Я надеюсь, что это сработает.
PS: он даст 0, так как double имеет все десятичные значения и ничего в левой части. В случае 0,58 это сузит его до 0. Но для других это сделает магию.
источник
Попробуй это
источник
Double и Integer являются классами-обертками для примитивов Java для double и int соответственно. Вы можете разыгрывать между ними, но вы потеряете плавающую точку. То есть 5.4, приведенное к int, будет 5. Если вы приведете его обратно, это будет 5.0.
источник
Просто используйте метод intValue Double
источник
Используйте
doubleNumber.intValue();
метод.источник
Память эффективна, так как будет разделять уже созданный экземпляр Double.
источник
Math.floor(...)
?intValue()
всегда полы в любом случае.Это сработало для меня. Попробуй это:
источник