มีวิธีใดบ้างที่จะส่ง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
intValue()
แล้ว
intValue()
มันก็ปลดเปลื้องไปยังdouble
int
คุณจำเป็นต้องรับค่า int โดยใช้ method 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);
จริงๆแล้วมีทางลัด คุณสามารถ unbox ทันทีจากตรงไปยังดั้งเดิม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
เมื่อเทียบกับ ยิ่งไปกว่านั้นคู่ยังสามารถถือ "ค่าพิเศษ" จำนวนเต็มที่ไม่สามารถ:
ดังนั้นขึ้นอยู่กับแอปพลิเคชันคุณอาจต้องการเพิ่มตัวกรองบางอย่างเพื่อหลีกเลี่ยงข้อยกเว้นที่น่ารังเกียจ
จากนั้นข้อบกพร่องถัดไปคือกลยุทธ์การปัดเศษ ตามค่าเริ่มต้น 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()
อันที่จริงวิธีที่ง่ายที่สุดคือการใช้งาน อย่างไรก็ตามนี่แค่คืนค่าจำนวนเต็ม มันไม่ได้ทำการปัดเศษใด ๆ หากคุณต้องการจำนวนเต็มใกล้เคียงกับค่า Double คุณจะต้องทำสิ่งนี้:
Integer integer = Integer.valueOf((int) Math.round(myDouble)));
และอย่าลืมกรณี null:
Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Math.round()
จัดการกับกรณีเป็ดแปลก ๆ เช่นอินฟินิตี้และน่านด้วยพระคุณญาติ
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();
หนึ่งควรเพิ่มว่ามันทำงานร่วมกับ autoboxing
มิฉะนั้นคุณจะได้รับ int (ดั้งเดิม) จากนั้นก็สามารถรับจำนวนเต็มได้:
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 เป็นสองเท่ามีค่าทศนิยมทั้งหมดและไม่มีอะไรอยู่ทางด้านซ้าย ในกรณีที่ 0.58 มันจะแคบลงเหลือ 0 แต่สำหรับคนอื่นมันจะใช้เวทย์มนตร์
ลองอันนี้
double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Double และ Integer เป็นคลาส wrapper สำหรับ Java primitives สำหรับ double และ int ตามลำดับ คุณสามารถร่ายได้ระหว่างนั้น แต่คุณจะเสียจุดลอย นั่นคือ 5.4 การขว้างไปที่ int จะเป็น 5 หากคุณเหวี่ยงมันกลับไปจะเป็น 5.0
เพียงใช้วิธี 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;