Überlauf

Kid

Mitglied
Hey Leute,

ich habe die Aufgabe bis Montag eine Taschenrechner mit Addition, Subtraktion, Division und Multiplikation in Java zu schreiben. Doch da ergibt sich bei mir die Frage, wie man es verhindern kann, dass das Programm kein falsches Ergebnis ausgibt, wenn man zum Beispiel 1234567000000000000000000000000000000 add 1234567000000000000000000000000000000 eingibt als aktuelle Parameter. Da gibt nämlich das Programm als Ergebnis -2 aus.
Wäre cool, wenn mir jemand das erklären könnte, wie man das macht.
 

Gucky

Top Contributor
Du könntest es mit BigInteger versuchen, wenn du solche Eingaben trotzdem verarbeiten willst oder sie nach der Eingabe abfangen.
 

Thallius

Top Contributor
Du kannst es auch als String nehmen und dann von Hand ausrechnen wie auf dem Papier. Dann gehen absolut beliebig lange Zahlen.

Gruß

Claus
 

InfectedBytes

Top Contributor
long (kleines L, ansonsten ist es die Wrapper Klasse) ist ein 64-Bit Datentyp und hat einen Bereich von -9223372036854775808 bis 9223372036854775807

edit:
Bisher haben wir allerdings nur über Ganzzahlen gesprochen, falls du auch Kommazahlen berechnen willst, kannst du z.B. double verwenden, welcher einen Wertebereich von etwa +- 10^308 hat. Allerdings nicht präzise, sondern nur mit etwa 15 signifikanten Stellen
 
Zuletzt bearbeitet:

Kid

Mitglied
ganz richtig, der Wertebereich des Datentyps long ist 64 Bit lang. Vielleicht sollte ich mich nochmal erklären. Ich möchte nicht, dass das Programm, wenn es über den Wert 9223372036854775807 kommt im Minusbereich weiterrechnet, sondern eine Fehlermeldung ausgibt und das weiß ich nicht, wie das funktioniert. Das gleiche natürlich bei -9223372036854775808.
 

consider

Mitglied
Wie wäre es, die Stellen einfach zu begrenzen? Die meisten Taschenrechner sind ja so aufgebaut, sodass deine Aufgabe damit sicherlich als erfüllt gilt.
 

Flown

Administrator
Mitarbeiter
Mit Java 8 ist eine Method in Math dazugekommen, die sich Math.addExact(long, long); nennt.

Wenn du noch kein Java 8 hast hier ist der Code (aus der src.zip):

Java:
public static int addExact(int x, int y) {
  int r = x + y;
  // HD 2-12 Overflow iff both arguments have the opposite sign of the result
  if (((x ^ r) & (y ^ r)) < 0) {
    throw new ArithmeticException("integer overflow");
  }
  return r;
}
 

DrZoidberg

Top Contributor
long und double sind keine gute Wahl für einen Taschenrechner. long wegen Überlauf und eingeschränktem Wertebereich und double aufgrund von Rundungsfehlern. z.B. 0.1 + 0.2 gibt 0.30000000000000004.
Das Beste wäre es BigDecimal für alle Rechnungen zu verwenden und dann per MathContext die Anzahl der gewünschten Stellen festzulegen.
 

Ähnliche Java Themen

Neue Themen


Oben