Java'da uzun bir int için nasıl dönüştürebilirim?


Yanıtlar:


371

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 2147483647ve daha küçük -2147483648) bazı bitleri kaybedeceğini ve yanlış temsil edileceğini unutmayın.

Örneğin, 2147483648olarak temsil edilir -2147483648.


Tamsayıların kesinliği nedir? o_O
khachik

3
@khachik Ben hassas 1. Veya :) tabii belki 42 olduğunu düşünüyorum
extraneon

7
Döküm, nesneler ve ilkel tipler için farklı anlamlara sahiptir. (int) 64 bitlik bir tamsayıyı 32 bitlik bir tamsayı olarak ele almaya çalışmaz, aslında aynı 32 alt sıralı bitlerle farklı bir 32 bitlik tamsayı döndürür. Nesnelerle, daha spesifik bir çocuk sınıfına atıyorsunuz, ancak ilkel türlerde, bir kadro gerçekten bir döküm değil, bir dönüşüm.
dspyz

Int x = (int) (((Uzun) Tamsayı.MAX_INTEGER) +10); Bir dönüşüm bu durumda x'in yanlış bir değere sahip olduğunu algılamazsa, bir çözümünüz yoktur.
raisercostin

Math.toIntExact () aslında harika bir yöntemdir. Değer bir int'e sığmayacak kadar büyükse atar ve istisna oluşturur. Önerin için teşekkürler.
java-addict301

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


3
Bunun en iyi yol olacağını söyleyebilirim.
17'de Simmant 9:43

Bu yolla sadece değeri vermek arasındaki fark nedir? Bence, intValue()burada arka plandaki her şey değer veriyor .. Değil mi?
Tim Wißmann

1
Türleri not edin. longBurada bir ilkel değil. LongDoğrudan bir ilkeye dökülemeyen referans türüdür int. int y = (int)x;bir infaz atar ama int y = (int)(long)xişe yarar . (Nedeni otomatik boks)
akop

58

Küçük değerler için döküm yeterlidir:

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

Ancak, longbir daha fazla bilgi tutabilir intmükemmel dan dönüştürmek mümkün değildir bu yüzden, longhiç intgenel durumda. Eğer longtutarı eşit veya ona eşit bir sayı tutarsa, Integer.MAX_VALUEherhangi 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ü xInteger.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_VALUEiçin `` MAX_VALUE '' yerine kullanın


Dolayısıyla, dönüşümün güvenli olup olmadığını tespit etmek ve bunun dışında bir istisna atmak uygun bir dönüşüm olacaktır. @Andrej Herich tarafından Guava kütüphanesini öneren gerçek.
raisercostin

55

Java 8'den beri kullanabilirsiniz: Math.toIntExact (uzun değer)

Bkz. JavaDoc: Math.toIntExact

Uzun bağımsız değişkenin değerini döndürür; değer bir int taşması durumunda bir istisna atma.

Math.toIntExactJDK 8'deki kaynak kodu :

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

37

Kullanılıyorsa Guava kitaplığını , yöntem vardır Ints.checkedCast(long)ve Ints.saturatedCast(long)dönüştürmek için longiçin int.


4
Kitaplık kullanmaya gerek yoktur
Grekz

6
@Grekz OP'ye kalmış. Bu durumda yapardım. Daha fazla bağımlılık kavanozuna sahip olmamanız için gerçek bir nedeniniz yoksa, daha fazla bağımlılık kavanozları, yeniden keşfedilen tekerleklerden daha iyidir.
djechlin

1
IMHO, bu cevap kabul edilenden çok daha iyi, çünkü hiç beklenmedik bir şey yapmıyor.
Mark Slater

5
Projem

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

ama bu bir longolarak temsil edilebilir varsayar int, ikisi arasındaki farkı biliyor musunuz?


6
Bilmek ilginçtir, java.sun.com/docs/books/jls/third_edition/html/… (Java Dil Spesifikasyonu) içindeki 5.1.3 paragrafına göre : Taşma, taşma veya diğer bilgi kaybına rağmen ilkel tipler arasındaki dönüşümleri daraltmak asla çalışma zamanı istisnasıyla sonuçlanmaz (§11).
extraneon

19

İlkel ve çağrı Longyerine sarmalayıcıyı kullanabilirsinizlong

Long.intValue()

Java7 intValue () belgeleri

longDeğeri a'ya sığacak şekilde yuvarlar / keser int.


Mevcut belgelere bağlanmak ve bunu genişletmek iyi bir fikir olabilir - kaçınılmaz olarak, uzun bir int'e dönüştürürken bir dereceye kadar yuvarlama olacaktır.
Makoto

2
Long.intValue () Java 7 uygulamasına baktığımızda, sadece döküm. Düşük / taşma kontrolü uygulanmaz. En azından Java 7 ile bu seçenek sadece: (int) someLong ile eşdeğerdir.
buzz3791

neden daha az oy veriyor? Bunu en değerli Cevaplardan birini buldum
Anand j. Kadhi

3

Doğrudan döküm hata gösteriyorsa, bunu şu şekilde yapabilirsiniz:

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

2

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


1
Soru, gördüğüm anda zaten cevaplanmıştı, ancak dönüşüm sınırlarının konusu açıklanmadı. Ben de öyle yaptım. Bunun "bla bla bla" olduğunu düşünüyorsanız, bu sadece bu tür bir şey olmadan gidebilen bir tür dahi olduğunuz anlamına gelir, ancak bizim için sadece insanlar, bir açıklama yararlı olabilir. "
Girişiniz

1

In Java 8 Ben şu şekilde yapın

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

Bu yöntem ArithmaticException, longdeğer aralığını aşarsa atar int. Böylece veri kaybına karşı güvende olurum.


0

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)

Yani böyle Function<Long,Integer> function =mi demek istiyorsun ?
Scratte

-1

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;


Bu yanlış, 3.120 uzun değil, çift veya kayan nokta sayısı.
George Xavier


-7

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

uzunluğa int dönüştür


6
Bahar Java olabilir, ancak Java Bahar değildir. "Java'da" yanlış bir ifade var.
Gordon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.