ฉันจะแปลง long เป็น int ใน Java ได้อย่างไร?


คำตอบ:


371

อัปเดตใน Java 8:

Math.toIntExact(value);

คำตอบเดิม:

การหล่อแบบง่าย ๆ ควรทำ:

long l = 100000;
int i = (int) l;

อย่างไรก็ตามโปรดทราบว่าตัวเลขขนาดใหญ่ (มักจะใหญ่กว่า2147483647และเล็กกว่า-2147483648) จะสูญเสียบิตบางส่วนและจะแสดงอย่างไม่ถูกต้อง

ยกตัวอย่างเช่นจะแสดงเป็น2147483648-2147483648


ความแม่นยำของจำนวนเต็มคืออะไร? o_O
khachik

3
@khachik ผมคิดว่ามีความแม่นยำคือ 1 หรืออาจจะ 42 แน่นอน :)
extraneon

7
การหล่อนั้นมีความหมายที่แตกต่างกันสำหรับวัตถุและสำหรับชนิดดั้งเดิม (int) l ไม่พยายามที่จะใช้เลขจำนวนเต็ม 64 บิตเป็นจำนวนเต็ม 32 บิต แต่จริง ๆ แล้วมันจะคืนค่าจำนวนเต็ม 32 บิตที่แตกต่างกันด้วย 32 บิตลำดับที่ต่ำกว่าเดิม ด้วยการใช้วัตถุคุณได้เลือกคลาสเด็กที่เฉพาะเจาะจงมากขึ้น แต่ด้วยประเภท Primitve นักแสดงไม่ใช่นักแสดง แต่เป็นผู้เปลี่ยนใจเลื่อมใส
dspyz

Int x = (int) (จำนวนเต็ม (ยาว) จำนวนเต็ม MAX_INTEGER) +10); หากการแปลงไม่ตรวจพบในกรณีนี้ว่า x มีค่าที่ไม่เหมาะสมคุณจะไม่มีทางออก
raisercostin

Math.toIntExact () เป็นวิธีที่ยอดเยี่ยมจริงๆ มันจะโยนและยกเว้นถ้าค่ามีขนาดใหญ่เกินไปที่จะพอดีกับ int ขอบคุณสำหรับคำแนะนำ
java-addict301

182
Long x = 100L;
int y = x.intValue();


3
ฉันจะบอกว่านี่จะเป็นวิธีที่ดีที่สุด
Simmant

ความแตกต่างระหว่างวิธีนี้และเพียงแค่คัดเลือกค่าคืออะไร? ฉันคิดว่าทุกอย่างที่intValue()นี่ในพื้นหลังหล่อมูลค่า .. ใช่มั้ย
ทิมWißmann

1
หมายเหตุประเภท มันไม่ใช่แบบดั้งเดิมlongที่นี่ ชนิดการอ้างอิงของตนซึ่งลาดเทโยนโดยตรงกับดั้งเดิมLong จะโยนการประหารชีวิต แต่จะทำงาน (เหตุผลคือการintint y = (int)x;int y = (int)(long)x
ออโตบอท

58

สำหรับค่าน้อยการหล่อก็เพียงพอแล้ว:

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'


ดังนั้นการแปลงที่เหมาะสมจะเป็นการตรวจสอบว่าการแปลงนั้นปลอดภัยและมีข้อยกเว้นเป็นอย่างอื่น ข้อเท็จจริงที่ระบุโดย @Andrej Herich ที่แนะนำห้องสมุด Guava
raisercostin

55

ตั้งแต่ Java 8 คุณสามารถใช้: Math.toIntExact (ค่ายาว)

ดู JavaDoc: 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;
}

37

หากมีการใช้ห้องสมุดฝรั่งมีวิธีการInts.checkedCast(long)และInts.saturatedCast(long)สำหรับการแปลงไปlongint


4
ไม่จำเป็นต้องใช้ห้องสมุด
Grekz

6
@ Grekz นั่นขึ้นอยู่กับ OP ฉันต้องการในกรณีนี้ ขวดพึ่งพามากขึ้นจะดีกว่าล้อที่คิดค้นขึ้นใหม่เว้นแต่ว่าคุณมีเหตุผลจริงที่จะไม่มีขวดพึ่งพามากขึ้น
djechlin

1
IMHO คำตอบนี้ดีกว่าคำตอบที่ได้รับการยอมรับอย่างมากเนื่องจากไม่เคยทำสิ่งที่ไม่คาดคิดมาก่อน
Mark Slater

5
เนื่องจากโครงการของฉันมีขวดนั้นอยู่แล้วมันจะมีประโยชน์มากกว่าที่จะใช้มันมากกว่าเขียนผู้ช่วยคนใหม่
Osify

24
long x = 3;
int y = (int) x;

แต่สมมติว่าlongสามารถแสดงเป็นintคุณรู้ความแตกต่างระหว่างสองหรือไม่


6
น่าสนใจที่จะรู้ว่าเป็นไปตามข้อ 5.1.3 ในjava.sun.com/docs/books/jls/third_edition/html/… (ภาษาจาวาสเปค): แม้ว่าข้อเท็จจริงที่ว่าล้น, อันเดอร์โฟล์หรือการสูญเสียข้อมูลอื่น ๆ อาจ เกิดขึ้นการลดการแปลงระหว่างประเภทดั้งเดิมจะไม่ส่งผลให้เกิดข้อยกเว้นขณะทำงาน (§11)
extraneon

19

คุณสามารถใช้Longwrapper แทนlongแบบดั้งเดิมและการโทร

Long.intValue()

เอกสาร Java7 intValue ()

มันรอบ / ตัดค่าตามพอดีในlongint


มันอาจเป็นความคิดที่ดีที่จะเชื่อมโยงไปยังเอกสารปัจจุบันรวมถึงการขยายในเรื่องนี้ - แน่นอนว่าจะมีการปัดเศษในระดับหนึ่งเมื่อแปลงยาวเป็น int
Makoto

2
ดูที่การนำ Java 7 ไปใช้งานของ Long.intValue () มันเป็นเพียงการคัดเลือก ไม่มีการตรวจสอบภายใต้ / มากเกินไป ดังนั้นอย่างน้อยผ่าน Java 7 ตัวเลือกนี้จะเท่ากับ: (int) someLong
buzz3791

ทำไม upvotes น้อยลง ฉันพบคำตอบที่มีค่าที่สุดข้อหนึ่ง
อานันท์เจ Kadhi

3

หากการส่งโดยตรงแสดงข้อผิดพลาดคุณสามารถทำสิ่งนี้ได้:

Long id = 100;
int int_id = (int) (id % 100000);

2

ใน 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


1
คำถามได้รับคำตอบแล้วในเวลาที่ฉันเห็น แต่ไม่มีการอธิบายหัวเรื่องของข้อ จำกัด ของการเปลี่ยนใจเลื่อมใส ซึ่งฉันทำแล้ว หากคุณคิดว่านั่นคือ "bla bla bla" นั่นแปลว่าคุณเป็นอัจฉริยะที่สามารถไปได้โดยปราศจากสิ่งนั้น แต่สำหรับเรามนุษย์เพียงคำอธิบายก็มีประโยชน์ ขอบคุณสำหรับ "ข้อมูล" ของคุณ ...
Alexis Dufrenoy

1

ในJava 8ฉันทำตามวิธีต่อไปนี้

long l = 100L;
int i = Math.toIntExact(l);

วิธีการนี้จะพ่นArithmaticExceptionถ้าค่าสูงเกินกว่าช่วงlong intดังนั้นฉันจึงปลอดภัยจากการสูญเสียข้อมูล


0

หากคุณต้องการแปลงที่ปลอดภัยและเพลิดเพลินกับการใช้ Java8 พร้อมกับการแสดงออกของแลมบ์ดาคุณสามารถใช้:

val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)

คุณหมายถึงการประกาศว่าเป็นFunction<Long,Integer> function =อย่างไร
Scratte

-1

ยาว x = 3120L; // ใช้ค่าใด ๆ ที่ยาว int z = x.intValue (); // คุณสามารถแปลง double เป็น int ได้เช่นเดียวกัน

หากคุณต้องการแอบแฝงโดยตรงแล้ว

longvalue.intvalue ();


นี่เป็นสิ่งที่ผิด 3.120 ไม่นานมันเป็นเลขคู่หรือเลขทศนิยม
George Xavier


-7

ในฤดูใบไม้ผลิมีวิธีการแปลงยาวเป็น int อย่างเข้มงวด

ไม่เพียง แต่ lnog สามารถแปลงเป็น int ได้คลาสชนิดใดก็ได้ที่ Number สามารถแปลงเป็น Number อื่น ๆ ได้โดยทั่วไปที่นี่ฉันจะแสดงให้คุณเห็นวิธีการแปลง long เป็น int เป็นประเภทอื่น ๆ ในทางกลับกัน

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);

แปลงยาวเป็น int


6
Spring อาจเป็น Java แต่ Java ไม่ใช่ Spring "ใน java มี" เป็นคำสั่งที่ผิด
Gordon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.