Wie kann ich ein Long in Java in int konvertieren?

Antworten:

371

Aktualisiert in Java 8:

Math.toIntExact(value);

Ursprüngliche Antwort:

Einfaches Typgießen sollte es tun:

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

Beachten Sie jedoch, dass große Zahlen (normalerweise größer als 2147483647und kleiner als -2147483648) einige der Bits verlieren und falsch dargestellt werden.

Zum Beispiel 2147483648würde dargestellt als -2147483648.

Frxstrem
quelle
Was ist die Genauigkeit von ganzen Zahlen? o_O
Khachik
3
@khachik ich denke , die Genauigkeit ist 1. Oder vielleicht 42 natürlich :)
extraneon
7
Casting hat unterschiedliche Bedeutungen für Objekte und für primitive Typen. (int) Ich versuche nicht, eine 64-Bit-Ganzzahl als 32-Bit-Ganzzahl zu behandeln, sondern gebe tatsächlich eine andere 32-Bit-Ganzzahl mit denselben 32 Bits niedrigerer Ordnung zurück. Bei Objekten wandeln Sie in eine spezifischere untergeordnete Klasse um, bei primitiven Typen ist eine Besetzung jedoch nicht wirklich eine Besetzung, sondern eine Konvertierung.
Dspyz
Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Wenn eine Konvertierung in diesem Fall nicht erkennt, dass x einen falschen Wert hat, haben Sie keine Lösung.
Rosercostin
Math.toIntExact () ist eine großartige Methode. Es wird eine Ausnahme ausgelöst, wenn der Wert zu groß ist, um in ein int zu passen. Danke für den Vorschlag.
Java-Addict301
182
Long x = 100L;
int y = x.intValue();

Laxman
quelle
3
Ich würde sagen, das wird der beste Weg sein.
Simmant
Was ist der Unterschied zwischen dieser Art und dem einfachen Casting des Werts? Ich denke, dass alles, was intValue()hier im Hintergrund geschieht, den Wert wirft. Richtig?
Tim Wißmann
1
Beachten Sie die Typen. Es ist hier kein Primitiv long. Es ist der Referenztyp, Longder nicht direkt in ein Primitiv umgewandelt werden kann int. int y = (int)x;wird eine Ausführung auslösen, int y = (int)(long)xwird aber funktionieren. (Der Grund ist Autoboxing)
Akop
58

Für kleine Werte reicht das Gießen aus:

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

A longkann jedoch mehr Informationen enthalten als a int, so dass es im allgemeinen Fall nicht möglich ist, perfekt von longzu konvertieren int. Wenn der longWert eine Zahl kleiner oder gleich enthält, können Integer.MAX_VALUESie ihn durch Casting konvertieren, ohne Informationen zu verlieren.

Zum Beispiel der folgende Beispielcode:

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

erzeugt die folgende Ausgabe auf meinem Computer:

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

Beachten Sie das negative Vorzeichen y. Da xein Wert größer als Integer.MAX_VALUE war, int ykonnte er nicht gehalten werden. In diesem Fall wurde es um die negativen Zahlen gewickelt.

Wenn Sie diesen Fall selbst behandeln möchten, können Sie Folgendes tun:

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

All dies setzt positive Zahlen voraus. Verwenden Sie für negative Zahlen MIN_VALUEanstelle von "MAX_VALUE"

mndrix
quelle
Eine ordnungsgemäße Konvertierung besteht also darin, festzustellen, ob die Konvertierung sicher ist, und ansonsten eine Ausnahme auszulösen. Fakt von @Andrej Herich, der die Guavenbibliothek vorschlug.
Rosercostin
55

Seit Java 8 können Sie Folgendes verwenden: Math.toIntExact (langer Wert)

Siehe JavaDoc: Math.toIntExact

Gibt den Wert des langen Arguments zurück. Auslösen einer Ausnahme, wenn der Wert ein int überschreitet.

Quellcode von Math.toIntExactin JDK 8:

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

Wenn Sie die Guava-Bibliothek verwenden , gibt es Methoden Ints.checkedCast(long)und Ints.saturatedCast(long)zum Konvertieren longin int.

Andrej Herich
quelle
4
Es ist nicht erforderlich, Bibliotheken zu verwenden
Grekz
6
@Grekz das liegt am OP. Ich würde in diesem Fall. Mehr Abhängigkeitsgläser sind besser als neu erfundene Räder, es sei denn, Sie haben einen tatsächlichen Grund, nicht mehr Abhängigkeitsgläser zu haben.
Djechlin
1
IMHO, diese Antwort ist viel besser als die akzeptierte, da sie niemals etwas Unerwartetes bewirkt.
Mark Slater
5
Da mein Projekt dieses Glas bereits enthält, wäre es
vorteilhafter
24
long x = 3;
int y = (int) x;

aber das setzt voraus, dass das longals dargestellt intwerden kann, kennen sie den unterschied zwischen den beiden?

Das Ö
quelle
6
Interessant zu wissen ist, dass gemäß Par 5.1.3 in java.sun.com/docs/books/jls/third_edition/html/… (Die Java-Sprachspezifikation): Trotz der Tatsache, dass Überlauf, Unterlauf oder anderer Informationsverlust auftreten können Wenn Konvertierungen zwischen primitiven Typen eingegrenzt werden, führt dies niemals zu einer Laufzeitausnahme (§11).
extraneon
18

Sie können den LongWrapper anstelle von longprimitiv und call verwenden

Long.intValue()

Java7 intValue () -Dokumente

Der longWert wird entsprechend gerundet / abgeschnitten , um in eine zu passen int.

eleonzx
quelle
Es kann eine gute Idee sein, auf die aktuelle Dokumentation zu verlinken und diese zu erweitern - bei der Konvertierung eines Longs in einen Int wird es zwangsläufig zu einer gewissen Rundung kommen.
Makoto
2
Wenn man sich die Java 7-Implementierung von Long.intValue () ansieht, ist es nur Casting. Es ist keine Unter- / Überlaufprüfung implementiert. Zumindest über Java 7 entspricht diese Option nur: (int) someLong.
Buzz3791
warum weniger positive Stimmen? Ich fand diese eine der wertvollsten Antworten
Anand j. Kadhi
3

Wenn das direkte Casting einen Fehler anzeigt, können Sie dies folgendermaßen tun:

Long id = 100;
int int_id = (int) (id % 100000);
Mohammad H.
quelle
2

In Java ist ein Long eine vorzeichenbehaftete 64-Bit-Zahl, dh Sie können Zahlen zwischen -9.223.372.036.854.775.808 und 9.223.372.036.854.775.807 (einschließlich) speichern.

Ein int ist dagegen mit einer 32-Bit-Nummer signiert, was bedeutet, dass Sie eine Nummer zwischen -2.147.483.648 und 2.147.483.647 (einschließlich) speichern können.

Wenn Ihr Long also außerhalb der für ein Int zulässigen Werte liegt, erhalten Sie keine wertvolle Konvertierung.

Details zur Größe primitiver Java-Typen finden Sie hier:

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

Alexis Dufrenoy
quelle
1
Die Frage wurde bereits beantwortet, als ich sie sah, aber das Thema der Grenzen der Konvertierung wurde nicht erklärt. Was ich damals getan habe. Wenn Sie denken, dass das "bla bla bla" ist, bedeutet das nur, dass Sie eine Art Genie sind, das auf so etwas verzichten kann, aber für uns bloße Menschen kann eine Erklärung nützlich sein. Vielen Dank für Ihre "Eingabe" ...
Alexis Dufrenoy
1

In Java 8 mache ich folgendes

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

Diese Methode löst aus, ArithmaticExceptionwenn der longWert den Bereich von überschreitet int. Somit bin ich vor Datenverlust sicher.

Emdadul Sawon
quelle
0

Wenn Sie eine sichere Konvertierung durchführen und die Verwendung von Java8 mit Lambda-Ausdruck genießen möchten, können Sie es wie folgt verwenden:

val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
user13651274
quelle
Du meinst es so zu deklarieren Function<Long,Integer> function =?
Scratte
-1

lang x = 3120L; // nimm einen beliebigen langen Wert int z = x.intValue (); // Sie können double auch auf die gleiche Weise in int konvertieren

wenn Sie dann direkt verdecken müssen

longvalue.intvalue ();

MANOJ G.
quelle
Dies ist falsch, 3.120 ist nicht lang, es ist eine Doppel- oder Gleitkommazahl.
George Xavier
-4
Long l = 100;
int i = Math.round(l);
Kristijan Drača
quelle
-7

Im Frühjahr gibt es eine strenge Möglichkeit, ein Long in Int umzuwandeln

Nicht nur lnog kann in int konvertieren, jeder Klassentyp erweitert Number kann generell in einen anderen Number-Typ konvertiert werden. Hier zeige ich Ihnen, wie Sie einen Long in int konvertieren, einen anderen Typ umgekehrt.

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

konvertiere lange nach int

tsaowe
quelle
6
Frühling mag Java sein, aber Java ist nicht Frühling. "In Java gibt es" ist eine falsche Aussage.
Gordon