Zwei Zahlen in Java addieren
Zahlen in Java addieren mit int, long, double und BigDecimal – auch mit Benutzereingaben.
Zwei Zahlen zu addieren ist die erste Rechenoperation, die die meisten Menschen in Java schreiben. Der „richtige" Weg hängt jedoch davon ab, woher die Zahlen stammen und wie groß sie werden können. Dieses Kapitel behandelt die idiomatischen Ansätze: einfache int-Arithmetik, das Parsen von Textwerten, Gleitkommaaddition und sicheres Addieren ohne stillen Überlauf.
Zwei int-Werte addieren
Der einfachste Fall ist das Addieren zweier int-Variablen mit dem +-Operator, einem der arithmetischen Operatoren von Java. Das Ergebnis ist selbst ein int.
int a = 7;
int b = 5;
int sum = a + b;
System.out.println(sum); // 12Dies ist der alltägliche Fall und der, den man am häufigsten schreibt. Zu beachten ist lediglich der Wertebereich von int: Er reicht von -2.147.483.648 bis 2.147.483.647. Wird dieser Grenzwert überschritten, läuft der Wert stillschweigend um, anstatt eine Ausnahme auszulösen – dazu weiter unten mehr.
Zahlen aus Text parsen und addieren
Wenn die Zahlen als Strings ankommen – aus Konsoleneingaben, einer Datei oder einer HTTP-Anfrage – müssen sie vor der Addition konvertiert werden. Verwende Integer.parseInt für ganze Zahlen oder Double.parseDouble für Dezimalzahlen.
String first = "42";
String second = "58";
int sum = Integer.parseInt(first) + Integer.parseInt(second);
System.out.println(sum); // 100Ein häufiger Anfängerfehler ist die direkte Verwendung von + auf den Strings: "42" + "58" ergibt "4258", da + Strings verkettet statt sie zu addieren. Zuerst parsen, dann addieren. Wenn der Text keine gültige Zahl ist, wirft parseInt eine NumberFormatException – bei nicht vertrauenswürdiger Eingabe also validieren oder den Aufruf in ein try/catch einwickeln.
Dezimalzahlen addieren und Überlauf behandeln
Für Dezimalwerte addiert man double- (oder float-) Operanden. Zu beachten ist, dass binäre Gleitkommazahlen nicht jede Dezimalzahl exakt darstellen können: 0.1 + 0.2 ergibt 0.30000000000000004 und nicht 0.3. Für Geldbeträge sollte stattdessen BigDecimal verwendet werden.
Für ganze Zahlen, die den int-Bereich überschreiten können, einen Operanden auf long erweitern oder Math.addExact verwenden, um bei Überlauf eine Ausnahme statt eines falschen Ergebnisses zu erhalten. Den richtigen numerischen Typ von vornherein zu wählen, ist die sauberste Lösung – die Wertebereiche der einzelnen Typen sind unter Java-Datentypen beschrieben.
| Ansatz | Verhalten bei Überlauf | Verwenden wenn |
|---|---|---|
int + int | Läuft stillschweigend um | Werte liegen sicher im int-Bereich |
(long) a + b | Berechnet in 64-Bit, kein Überlauf | Summe kann int überschreiten, passt aber in long |
Math.addExact(a, b) | Wirft ArithmeticException | Überlauf muss erkannt, nicht ignoriert werden |
BigInteger / BigDecimal | Beliebige Genauigkeit | Werte können beliebig groß sein oder exakte Dezimalstellen erfordern |
int big = Integer.MAX_VALUE;
System.out.println(big + 1); // -2147483648 (wrapped!)
System.out.println((long) big + 1); // 2147483648 (correct)
System.out.println(Math.addExact(big, 1)); // throws ArithmeticExceptionZwei vom Benutzer eingegebene Zahlen addieren
In einem echten Programm stammen die Operanden oft von der Tastatur. Ein Scanner liest jede Zeile und konvertiert sie in einem Schritt mit nextInt (oder nextDouble für Dezimalzahlen) in eine Zahl, sodass parseInt nicht manuell aufgerufen werden muss.
import java.util.Scanner;
public class AddInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter first number: ");
int a = scanner.nextInt();
System.out.print("Enter second number: ");
int b = scanner.nextInt();
System.out.println("Sum: " + (a + b));
}
}Gibt der Benutzer etwas ein, das keine ganze Zahl ist, wirft nextInt eine InputMismatchException. Bei nicht vertrauenswürdiger Eingabe dagegen mit hasNextInt() oder einem try/catch absichern.
Ein vollständiges Beispiel
Was die Ausgabe zeigt:
int sum: 12zeigt den einfachen+-Operator, der zweiint-Werte direkt addiert – der Alltagsfall.parsed sum: 100bestätigt, dassInteger.parseIntaus"42"und"58"Zahlen macht, bevor sie addiert werden, statt sie zu"4258"zu verketten.double sum: 0.30000000000000004ist der Gleitkommadarstellungsfehler von0.1 + 0.2– Beweis dafür, dassdoublebei Dezimalzahlen nicht exakt ist; für präzise Berechnungen sollteBigDecimalverwendet werden.int overflow: -2147483648zeigt, wieInteger.MAX_VALUE + 1stillschweigend zum kleinsten negativenintumläuft, währendlong safe: 2147483648das richtige Ergebnis liefert, indem ein Operand auflongerweitert wird.addExact: overflow detectedbestätigt, dassMath.addExactbei demselben Überlauf eineArithmeticExceptionwirft, statt einen falschen Wert zurückzugeben.