Java- Taschenrechner geht nicht mit Kommazahlen, obwohl float ?

4 Antworten

Dein Quelltext ist nicht formatiert. Niemand hat Lust sich das anzusehen.

Anmerkung: Kommazahlen schreibt man mit "." nicht mit "," falls es daran liegen sollte.

1) Formatiere deinen Quelltext, nutze den GF-Editor.

2) Fasse Deklarationen und Definitionen zu Initialisierungen zusammen, um Zeilen zu sparen und Variablen nur ab dem Zeitpunkt einzuführen, ab dem sie wirklich benötigt werden.

Also statt:

float zahl1;
// ...
zahl1 = eingabe1.nextFloat();

Besser so:

float zahl1 = eingabe1.nextFloat();

Letzten Endes wird dein Code so auch übersichtlicher.

3) Halte dich an Konventionen, Variablennamen beginnen mit einem Kleinbuchstaben.

4) Ein Scanner-Objekt zum Lesen aller Eingaben reicht völlig. Du liest schließlich Daten auch nur aus einem Stream aus. Des Weiteren solltest du den Stream schließen, sobald du ihn nicht mehr benötigst.

eingabe1.close();

5) Verwende entweder switch-case oder if-else if-else, denn du weißt ja, dass insgesamt nur ein Fall an Operator zutreffen wird. Da brauchst du die anderen Fälle nicht mehr abprüfen, wenn einer als wahr bestätigt werden konnte.

if (operator == '+') {
  // ...
}
else if (operator == '-') {
  // ...
}
else if (operator == '*') {
  // ...
}
else if (operator == '/') {
  // ...
}

6) Bedenke, dass die Division durch 0 nicht möglich ist. Diesen Fall solltest du bei der Division also mit prüfen und behandeln.

(...) jetzt würde ich gerne wissen warum eine Fehlermeldung kommt, wenn ich eine Kommazahl in die Konsole eingebe. Mit einer ganzen Zahl geht es (...)

Ich vermute mal, du gibst ein Komma ein, statt einem Punkt. Letzterer wäre richtig.

Dein Code ist vollkommen korrekt und funktioniert auch mit Kommazahlen ohne Probleme. Beachte allerdings, dass du statt dem Komma einen Punkt verwenden musst. Ansonsten solltest du noch einige Dinge beachten, um deinen Code zu verbessern:

  • Formatiere stets deinen Code, wenn du auf einer Online-Plattform um Hilfe bittest. Nutzer immer Code-Tags. Ansonsten sind Einrückungen v.a. hilfreich für die Übersicht und helfen dir bei der Entwicklung enorm.
  • Halte dich an die Java Conventions und schreibe alle Methoden- sowie Variablen-/Attributbezeichner mit kleinem Anfangsbuchstaben und in der Kamelhöckerschreibweise.
  • Wozu benötigst du in diesem Code drei Scanner? Einer reicht doch vollkommen aus. Vergiss übrigens nicht, den Eingabestream wieder zu schließen.
  • Ein switch-case-Konstrukt kann in dem vorliegenden Fall wesentlich übersichtlicher sein als ein if-else-Konstrukt.
  • Beachte das DRY-Prinzip und wiederhole dies nicht. Du musst nicht für jeden einzelnen Fall notieren, dass das Ergebnis ausgegeben werden soll, da dies in jedem Fall geschieht. Gib das Ergebnis doch einfach nach den Abfragen aus, dann musst du dafür nur eine einzige Zeile notieren.

Es ergibt sich somit folgender verbesserter Code:

public class Taschenrechner {
  public static void main(String[] args) {
  
  float zahl1;
  float zahl2;
  float ergebnis = 0;
  
  Scanner eingabe = new Scanner(System.in);
  zahl1 = eingabe.nextFloat();
  char operator = eingabe.next().charAt(0);
  zahl2 = eingabe.nextFloat();
  
  switch(operator) {
    case '+':
      ergebnis = zahl1 + zahl2;
      break;
    case '-':
      ergebnis = zahl1 - zahl2;
      break;
    case '/':
      ergebnis = zahl1 / zahl2;
      break;
    case '*':
      ergebnis = zahl1 * zahl2;
  }
  
  System.out.println(ergebnis);
  eingabe.close();
  
  }
}

Ansonsten kannst du für den Scanner das Locale so setzen, dass Kommata statt Punkte als Eingaben akzeptiert werden. Selbiges lässt sich mithilfe von DecimalFormat auch für die Ausgabe umsetzen:

public class Taschenrechner {
  public static void main(String[] args) {
  
  float zahl1;
  float zahl2;
  float ergebnis = 0;
  
  Scanner eingabe = new Scanner(System.in);
  eingabe.useLocale(Locale.GERMANY);
  
  zahl1 = eingabe.nextFloat();
  char operator = eingabe.next().charAt(0);
  zahl2 = eingabe.nextFloat();
  
  switch(operator) {
    case '+':
      ergebnis = zahl1 + zahl2;
      break;
    case '-':
      ergebnis = zahl1 - zahl2;
      break;
    case '/':
      ergebnis = zahl1 / zahl2;
      break;
    case '*':
      ergebnis = zahl1 * zahl2;
  }
  
  DecimalFormat df = new DecimalFormat("#.###");
  DecimalFormatSymbols sym = DecimalFormatSymbols.getInstance();
  sym.setDecimalSeparator(',');
  df.setDecimalFormatSymbols(sym);
  
  System.out.println(df.format(ergebnis));
  eingabe.close();
  
  }
}

Außerdem ist es ratsam, die Nutzereingaben mithilfe von Exceptions zu überprüfen, denn der Nutzer kann sich auch mal vertippen. Dazu zählen auch Sonderfälle wie die Division durch Null. In diesem Falle wäre eine eigene Fehlermeldung sicherlich besser, als der Text der Exception. So könnte man auch vermeiden, dass das Programm abstürzt und den Nutzer einfach nochmal fragen.

Gib doch deine Fließkommazahl mit "." und nicht mit "," ein :-)