Yanıtlar:
Java 8'de güncellendi:
Math.toIntExact(value);
Orijinal Yanıt:
Basit tip döküm bunu yapmalıdır:
long l = 100000;
int i = (int) l;
Bununla birlikte, büyük sayıların (genellikle daha büyük 2147483647
ve daha küçük -2147483648
) bazı bitleri kaybedeceğini ve yanlış temsil edileceğini unutmayın.
Örneğin, 2147483648
olarak temsil edilir -2147483648
.
Long x = 100L;
int y = x.intValue();
intValue()
burada arka plandaki her şey değer veriyor .. Değil mi?
long
Burada bir ilkel değil. Long
Doğrudan bir ilkeye dökülemeyen referans türüdür int
. int y = (int)x;
bir infaz atar ama int y = (int)(long)x
işe yarar . (Nedeni otomatik boks)
Küçük değerler için döküm yeterlidir:
long l = 42;
int i = (int) l;
Ancak, long
bir daha fazla bilgi tutabilir int
mükemmel dan dönüştürmek mümkün değildir bu yüzden, long
hiç int
genel durumda. Eğer long
tutarı eşit veya ona eşit bir sayı tutarsa, Integer.MAX_VALUE
herhangi bir bilgi kaybetmeden yayın yaparak dönüştürebilirsiniz.
Örneğin, aşağıdaki örnek kod:
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);
makinemde aşağıdaki çıktıyı üretir:
largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648
Negatif işarete dikkat edin y
. Çünkü x
Integer.MAX_VALUE değerinden bir büyük değere sahip olduğu için bu değer tutulamadı int y
. Bu durumda, negatif sayılara sarılır.
Bu davayı kendiniz halletmek istiyorsanız, şöyle bir şey yapabilirsiniz:
if ( x > (long)Integer.MAX_VALUE ) {
// x is too big to convert, throw an exception or something useful
}
else {
y = (int)x;
}
Bütün bunlar pozitif sayılar varsayar. Negatif sayılar MIN_VALUE
için `` MAX_VALUE '' yerine kullanın
Java 8'den beri kullanabilirsiniz: Math.toIntExact (uzun değer)
Uzun bağımsız değişkenin değerini döndürür; değer bir int taşması durumunda bir istisna atma.
Math.toIntExact
JDK 8'deki kaynak kodu :
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
Kullanılıyorsa Guava kitaplığını , yöntem vardır Ints.checkedCast(long)
ve Ints.saturatedCast(long)
dönüştürmek için long
için int
.
long x = 3;
int y = (int) x;
ama bu bir long
olarak temsil edilebilir varsayar int
, ikisi arasındaki farkı biliyor musunuz?
İlkel ve çağrı Long
yerine sarmalayıcıyı kullanabilirsinizlong
Long.intValue()
long
Değeri a'ya sığacak şekilde yuvarlar / keser int
.
Doğrudan döküm hata gösteriyorsa, bunu şu şekilde yapabilirsiniz:
Long id = 100;
int int_id = (int) (id % 100000);
Java'da, uzun bir işaretli 64 bitlik bir sayıdır, yani -9,223,372,036,854,775,808 ile 9,223,372,036,854,775,807 (dahil) arasındaki sayıları saklayabilirsiniz.
Öte yandan, bir int 32 bit sayısı ile imzalanır, yani -2,147,483,648 ile 2,147,483,647 (dahil) arasında sayı kaydedebilirsiniz.
Bu nedenle, uzun süreniz bir int için izin verilen değerlerin dışındaysa, değerli bir dönüşüm elde edemezsiniz.
İlkel Java türlerinin boyutları hakkında ayrıntılar burada:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
In Java 8 Ben şu şekilde yapın
long l = 100L;
int i = Math.toIntExact(l);
Bu yöntem ArithmaticException
, long
değer aralığını aşarsa atar int
. Böylece veri kaybına karşı güvende olurum.
Güvenli bir dönüşüm yapmak ve Lambda ifadesi ile Java8 kullanımının keyfini çıkarmak istiyorsanız Şunun gibi kullanabilirsiniz:
val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
Function<Long,Integer> function =
mi demek istiyorsun ?
uzun x = 3120L; // herhangi bir uzun değeri al int z = x.intValue (); // ikisini de int'e aynı şekilde dönüştürebilirsin
doğrudan örtbas etmeniz gerekiyorsa
) (Longvalue.intvalue;
Long l = 100;
int i = Math.round(l);
İlkbaharda, uzun bir int'e dönüştürmek için titiz bir yol var.
sadece lnog int dönüştürebilirsiniz, herhangi bir sınıf türü genişletir Sayı genel olarak diğer Sayı türüne dönüştürebilirsiniz, burada size nasıl int uzun, diğer tip tersi dönüştürmek gösterecektir.
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);