Làm thế nào tôi có thể chuyển đổi một long thành int trong Java?


Câu trả lời:


371

Đã cập nhật, trong Java 8:

Math.toIntExact(value);

Câu trả lời gốc:

Đúc kiểu đơn giản nên làm điều đó:

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

Tuy nhiên, lưu ý rằng số lượng lớn (thường lớn hơn 2147483647và nhỏ hơn -2147483648) sẽ mất một số bit và sẽ được biểu diễn không chính xác.

Ví dụ, 2147483648sẽ được đại diện là -2147483648.


Độ chính xác của số nguyên là gì? o_O
khachik

3
@khachik Tôi nghĩ độ chính xác là 1. Hoặc có thể là 42 dĩ nhiên :)
extraneon

7
Đúc có ý nghĩa khác nhau cho các đối tượng và cho các loại nguyên thủy. (int) l không thử coi số nguyên 64 bit là số nguyên 32 bit, nó thực sự trả về một số nguyên 32 bit khác với cùng 32 bit thứ tự thấp hơn. Với các đối tượng, bạn chuyển sang một lớp con cụ thể hơn, nhưng với các kiểu nguyên thủy, một diễn viên không thực sự là một diễn viên, mà là một chuyển đổi.
dspyz

Int x = (int) (((Dài) Số nguyên.MAX_INTEGER) +10); Nếu một chuyển đổi không phát hiện ra trong trường hợp này x có giá trị không phù hợp thì bạn không có giải pháp.
raisercostin

Math.toIntExact () là một phương thức tuyệt vời thực sự. Nó ném và ngoại lệ nếu giá trị quá lớn để phù hợp với một int. Cám ơn vì sự gợi ý.
java-nghiện602

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


3
Tôi sẽ nói đây sẽ là cách tốt nhất.
Simmant ngày

Sự khác biệt giữa cách này và chỉ đơn giản là đúc giá trị là gì? Tôi nghĩ rằng, tất cả những gì intValue()ở đây trong nền là đúc giá trị .. Phải không?
Tim Wißmann

1
Lưu ý các loại. Nó không phải là một nguyên thủy longở đây. Đây là loại tham chiếu Longkhông thể đúc trực tiếp đến một nguyên thủy int. int y = (int)x;sẽ ném một thực thi nhưng int y = (int)(long)xsẽ làm việc. (Lý do là autoboxing)
akop

58

Đối với các giá trị nhỏ, truyền là đủ:

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

Tuy nhiên, a longcó thể chứa nhiều thông tin hơn một int, vì vậy không thể chuyển đổi hoàn hảo từ longsang int, trong trường hợp chung. Nếu số longgiữ nhỏ hơn hoặc bằng Integer.MAX_VALUEbạn có thể chuyển đổi nó bằng cách truyền mà không mất bất kỳ thông tin nào.

Ví dụ: mã mẫu sau:

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);

tạo đầu ra sau trên máy của tôi:

largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648

Lưu ý các dấu hiệu tiêu cực trên y. Bởi vì xgiữ một giá trị lớn hơn Integer.MAX_VALUE, int ykhông thể giữ giá trị đó. Trong trường hợp này, nó bao quanh các số âm.

Nếu bạn muốn tự xử lý trường hợp này, bạn có thể làm một việc như:

if ( x > (long)Integer.MAX_VALUE ) {
    // x is too big to convert, throw an exception or something useful
}
else {
    y = (int)x;
}

Tất cả điều này giả định số dương. Đối với số âm, sử dụng MIN_VALUEthay vì `MAX_VALUE '


Vì vậy, một chuyển đổi thích hợp sẽ là phát hiện xem chuyển đổi có an toàn không và đưa ra một ngoại lệ khác. Sự thật được nêu bởi @Andrej Herich đã đề xuất thư viện Guava.
raisercostin

55

Vì Java 8, bạn có thể sử dụng: Math.toIntExact (giá trị dài)

Xem JavaDoc: Math.toIntExact

Trả về giá trị của đối số dài; ném một ngoại lệ nếu giá trị vượt quá int.

Mã nguồn Math.toIntExacttrong JDK 8:

public static int toIntExact(long value) {
    if ((int)value != value) {
        throw new ArithmeticException("integer overflow");
    }
    return (int)value;
}

37

Nếu sử dụng thư viện Guava , có các phương thức Ints.checkedCast(long)Ints.saturatedCast(long)để chuyển đổi longthành int.


4
Không cần sử dụng thư viện
Grekz

6
@Grekz đó là lên đến OP. Tôi sẽ trong trường hợp này. Nhiều lọ phụ thuộc tốt hơn so với các bánh xe được phát minh lại trừ khi bạn có lý do thực tế để không có nhiều lọ phụ thuộc hơn.
djechlin

1
IMHO, câu trả lời này tốt hơn nhiều so với câu trả lời được chấp nhận, ở chỗ nó không bao giờ làm điều gì đó bất ngờ.
Đánh dấu Slater

5
Vì dự án của tôi đã bao gồm cái bình đó, nên sử dụng nó sẽ có ích hơn là viết một người trợ giúp mới
Osify

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

Nhưng điều đó giả định rằng longcó thể được đại diện như một int, bạn có biết sự khác biệt giữa hai?


6
Điều thú vị là theo mệnh đề 5.1.3 trong java.sun.com/docs/books/jls/third_edition/html/ trộm (Thông số ngôn ngữ Java): Mặc dù thực tế là tràn, tràn hoặc mất thông tin khác xảy ra, thu hẹp chuyển đổi giữa các loại nguyên thủy không bao giờ dẫn đến ngoại lệ thời gian chạy (§11).
extraneon

19

Bạn có thể sử dụng Longtrình bao bọc thay vì longnguyên thủy và gọi

Long.intValue()

Tài liệu Java7 intValue ()

Nó làm tròn / cắt bớt longgiá trị phù hợp để phù hợp với một int.


Có thể là một ý tưởng tốt để liên kết đến tài liệu hiện tại, cũng như mở rộng về điều này - chắc chắn, sẽ có một số mức độ làm tròn khi chuyển đổi dài sang int.
Makoto

2
Nhìn vào triển khai Java 7 của Long.intValue (), nó chỉ đang truyền. Không có kiểm tra dưới / tràn được thực hiện. Vì vậy, ít nhất là thông qua Java 7, tùy chọn này tương đương với chỉ: (int) someLong.
buzz3791

Tại sao ít upvote? Tôi tìm thấy một trong những câu trả lời có giá trị nhất
Anand j. Kadhi

3

Nếu truyền trực tiếp cho thấy lỗi, bạn có thể làm như thế này:

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

2

Trong Java, một số dài là một số 64 bit đã ký, có nghĩa là bạn có thể lưu trữ các số trong khoảng từ -9,223,372,036,854,775,809 và 9,223,372,036,854,775,807 (đã bao gồm).

Mặt khác, int được ký số 32 bit, có nghĩa là bạn có thể lưu trữ số trong khoảng từ -2,147,483,648 đến 2,147,483,647 (đã bao gồm).

Vì vậy, nếu thời gian dài của bạn nằm ngoài các giá trị được phép cho một int, bạn sẽ không nhận được chuyển đổi có giá trị.

Chi tiết về kích thước của các loại Java nguyên thủy ở đây:

http://doad.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


1
Câu hỏi đã được trả lời tại thời điểm tôi nhìn thấy nó, nhưng chủ đề về các giới hạn của chuyển đổi không được giải thích. Mà tôi đã làm sau đó. Nếu bạn nghĩ đó là "bla bla bla", điều đó chỉ có nghĩa bạn là một loại thiên tài có thể đi mà không cần điều đó, nhưng đối với chúng tôi, chỉ là con người, một lời giải thích có thể hữu ích. Cảm ơn bạn đã "nhập liệu" ...
Alexis Dufrenoy

1

Trong Java 8 tôi làm theo cách sau

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

Phương pháp này ném ArithmaticExceptionnếu longgiá trị vượt quá phạm vi int. Vì vậy, tôi an toàn từ mất dữ liệu.


0

Nếu bạn muốn thực hiện chuyển đổi an toàn và tận hưởng việc sử dụng Java8 với biểu thức Lambda Bạn có thể sử dụng nó như sau:

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

Bạn có nghĩa là tuyên bố nó như thế Function<Long,Integer> function =nào?
Scratte

-1

dài x = 3120L; // lấy bất kỳ giá trị dài int z = x.intValue (); // bạn có thể chuyển đổi gấp đôi thành int cũng theo cách tương tự

nếu bạn cần chuyển đổi trực tiếp thì

longvalue.intvalue ();


Điều này là sai, 3.120 không phải là một số dài, nó là một số điểm kép hoặc dấu phẩy động.
George Xavier


-7

Trong mùa xuân, có một cách nghiêm ngặt để chuyển đổi dài sang int

Không chỉ lnog có thể chuyển đổi thành int, bất kỳ loại lớp mở rộng nào Số đều có thể chuyển đổi sang loại Số khác nói chung, ở đây tôi sẽ chỉ cho bạn cách chuyển đổi dài sang int, ngược lại.

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

chuyển đổi dài sang int


6
Spring có thể là Java, nhưng Java không phải là Spring. "Trong java, có" là một tuyên bố sai.
Gordon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.