Відповіді:
A 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
) діють як коробки / обгортки навколо цих примітивів, що дає можливість використовувати їх як предмети.
Щоб перетворити ліцензію Double
на ліцензію 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());
Тепер він працює чудово для більшості цінностей. Однак цілі числа мають дуже малий діапазон (значення min / max) порівняно з a 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 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)
, який має кеш для малих цілих чисел, таких як цей.
Це можна зробити, скориставшись "Звуженням або явним перетворенням типу", подвійним → довгим → int. Сподіваюся, це спрацює.
double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l; // Explicit type casting required
PS: Він дасть 0, оскільки у подвійних значень є всі десяткові значення і нічого немає з лівого боку. У випадку 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;