Câu trả lời:
Đã 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 2147483647
và 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ụ, 2147483648
sẽ được đại diện là -2147483648
.
Long x = 100L;
int y = x.intValue();
intValue()
ở đây trong nền là đúc giá trị .. Phải không?
long
ở đây. Đây là loại tham chiếu Long
khô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)x
sẽ làm việc. (Lý do là autoboxing)
Đối với các giá trị nhỏ, truyền là đủ:
long l = 42;
int i = (int) l;
Tuy nhiên, a long
có 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ừ long
sang int
, trong trường hợp chung. Nếu số long
giữ nhỏ hơn hoặc bằng Integer.MAX_VALUE
bạ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ì x
giữ một giá trị lớn hơn Integer.MAX_VALUE, int y
khô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_VALUE
thay vì `MAX_VALUE '
Vì Java 8, bạn có thể sử dụng: Math.toIntExact (giá trị dài)
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.toIntExact
trong JDK 8:
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
Nếu sử dụng thư viện Guava , có các phương thức Ints.checkedCast(long)
và Ints.saturatedCast(long)
để chuyển đổi long
thành int
.
long x = 3;
int y = (int) x;
Nhưng điều đó giả định rằng long
có thể được đại diện như một int
, bạn có biết sự khác biệt giữa hai?
Bạn có thể sử dụng Long
trình bao bọc thay vì long
nguyên thủy và gọi
Long.intValue()
Nó làm tròn / cắt bớt long
giá trị phù hợp để phù hợp với một int
.
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);
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
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 ArithmaticException
nếu long
giá trị vượt quá phạm vi int
. Vì vậy, tôi an toàn từ mất dữ liệu.
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)
Function<Long,Integer> function =
nào?
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 ();
Long l = 100;
int i = Math.round(l);
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);