ฉันจะแปลง long เป็น int ใน Java ได้อย่างไร?
ฉันจะแปลง long เป็น int ใน Java ได้อย่างไร?
คำตอบ:
อัปเดตใน Java 8:
Math.toIntExact(value);
คำตอบเดิม:
การหล่อแบบง่าย ๆ ควรทำ:
long l = 100000;
int i = (int) l;
อย่างไรก็ตามโปรดทราบว่าตัวเลขขนาดใหญ่ (มักจะใหญ่กว่า2147483647และเล็กกว่า-2147483648) จะสูญเสียบิตบางส่วนและจะแสดงอย่างไม่ถูกต้อง
ยกตัวอย่างเช่นจะแสดงเป็น2147483648-2147483648
Long x = 100L;
int y = x.intValue();
intValue()นี่ในพื้นหลังหล่อมูลค่า .. ใช่มั้ย
longที่นี่ ชนิดการอ้างอิงของตนซึ่งลาดเทโยนโดยตรงกับดั้งเดิมLong จะโยนการประหารชีวิต แต่จะทำงาน (เหตุผลคือการintint y = (int)x;int y = (int)(long)x
สำหรับค่าน้อยการหล่อก็เพียงพอแล้ว:
long l = 42;
int i = (int) l;
แต่longสามารถเก็บข้อมูลมากกว่าintดังนั้นจึงเป็นไปไม่ได้อย่างสมบูรณ์แบบแปลงจากlongไปintในกรณีทั่วไป หากจำนวนที่longถือน้อยกว่าหรือเท่ากับInteger.MAX_VALUEคุณสามารถแปลงได้โดยการคัดเลือกโดยไม่สูญเสียข้อมูลใด ๆ
ตัวอย่างเช่นโค้ดตัวอย่างต่อไปนี้:
System.out.println( "largest long is " + Long.MAX_VALUE );
System.out.println( "largest int is " + Integer.MAX_VALUE );
long x = (long)Integer.MAX_VALUE;
x++;
System.out.println("long x=" + x);
int y = (int) x;
System.out.println("int y=" + y);
สร้างผลลัพธ์ต่อไปนี้บนเครื่องของฉัน:
largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648
yสังเกตสัญญาณเชิงลบเกี่ยวกับ เนื่องจากxเก็บค่าที่มีขนาดใหญ่กว่า Integer.MAX_VALUE int yจึงไม่สามารถถือได้ ในกรณีนี้มันล้อมรอบกับจำนวนลบ
หากคุณต้องการจัดการกรณีนี้ด้วยตัวคุณเองคุณอาจทำสิ่งต่อไปนี้
if ( x > (long)Integer.MAX_VALUE ) {
// x is too big to convert, throw an exception or something useful
}
else {
y = (int)x;
}
ทั้งหมดนี้ถือว่าเป็นจำนวนบวก สำหรับตัวเลขลบให้ใช้MIN_VALUEแทน 'MAX_VALUE'
ตั้งแต่ Java 8 คุณสามารถใช้: Math.toIntExact (ค่ายาว)
ส่งคืนค่าของอาร์กิวเมนต์ที่มีความยาว โยนข้อยกเว้นถ้าค่าล้น int
ซอร์สโค้ดของMath.toIntExactใน JDK 8:
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
หากมีการใช้ห้องสมุดฝรั่งมีวิธีการInts.checkedCast(long)และInts.saturatedCast(long)สำหรับการแปลงไปlongint
long x = 3;
int y = (int) x;
แต่สมมติว่าlongสามารถแสดงเป็นintคุณรู้ความแตกต่างระหว่างสองหรือไม่
คุณสามารถใช้Longwrapper แทนlongแบบดั้งเดิมและการโทร
Long.intValue()
มันรอบ / ตัดค่าตามพอดีในlongint
หากการส่งโดยตรงแสดงข้อผิดพลาดคุณสามารถทำสิ่งนี้ได้:
Long id = 100;
int int_id = (int) (id % 100000);
ใน Java ความยาวคือหมายเลข 64 บิตที่ลงชื่อซึ่งหมายความว่าคุณสามารถเก็บหมายเลขระหว่าง -9,223,372,036,854,775,808 และ 9,223,372,036,854,775,807 (รวม)
ในทางกลับกันมีการลงนามหมายเลข 32 บิตซึ่งหมายความว่าคุณสามารถจัดเก็บหมายเลขระหว่าง -2,147,483,648 ถึง 2,147,483,647 (รวม)
ดังนั้นหากความยาวของคุณอยู่นอกค่าที่อนุญาตสำหรับ int คุณจะไม่ได้รับการแปลงที่มีค่า
รายละเอียดเกี่ยวกับขนาดของประเภท Java ดั้งเดิมที่นี่:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
ในJava 8ฉันทำตามวิธีต่อไปนี้
long l = 100L;
int i = Math.toIntExact(l);
วิธีการนี้จะพ่นArithmaticExceptionถ้าค่าสูงเกินกว่าช่วงlong intดังนั้นฉันจึงปลอดภัยจากการสูญเสียข้อมูล
หากคุณต้องการแปลงที่ปลอดภัยและเพลิดเพลินกับการใช้ Java8 พร้อมกับการแสดงออกของแลมบ์ดาคุณสามารถใช้:
val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
Function<Long,Integer> function =อย่างไร
ยาว x = 3120L; // ใช้ค่าใด ๆ ที่ยาว int z = x.intValue (); // คุณสามารถแปลง double เป็น int ได้เช่นเดียวกัน
หากคุณต้องการแอบแฝงโดยตรงแล้ว
longvalue.intvalue ();
Long l = 100;
int i = Math.round(l);
ในฤดูใบไม้ผลิมีวิธีการแปลงยาวเป็น int อย่างเข้มงวด
ไม่เพียง แต่ lnog สามารถแปลงเป็น int ได้คลาสชนิดใดก็ได้ที่ Number สามารถแปลงเป็น Number อื่น ๆ ได้โดยทั่วไปที่นี่ฉันจะแสดงให้คุณเห็นวิธีการแปลง long เป็น int เป็นประเภทอื่น ๆ ในทางกลับกัน
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);
