Erste Schritte "Taschenrechner" zeigt keine Komma Zahlen an.

  • Themenstarter Themenstarter Kleechen
  • Beginndatum Beginndatum
K

Kleechen

Gast
Hallöle,

Ich fange gerade aus schulischen Gründen mit Informatik an und nun bin ich hier.
Wir machen da gerade einen Addition- und Subtraktionsrechner.
Ich wollte weiter daran arbeiten und bin nun auf ein Problem gestoßen bei Division, das wären wie im Titel geschrieben, die Komma Zahlen.
Ich habe auch schon gelesen, das viele dieses generelle Problem mit Kommazahlen haben aber nicht in dem Kontext.
Hier der Code von der Division:

[CODE lang="java" title="Divisions Code"]public void bDivision_ActionPerformed(ActionEvent evt) {
// TODO hier Quelltext einfügen
int Zahl1 = jNumberField1.getInt();
int Zahl2 = jNumberField2.getInt();
int division = Zahl1 / Zahl2;
jLabel1.setText("" + division);
} // end of bDivision_ActionPerformed[/CODE]

Hier ein paar Bilder vom Aufbau und Struktur für einen Überblick:
Rechner.PNG
Struktur.PNG

Meine Frage ist bestimmt klar könnte mir jemand (nicht einfach nur zeigen) sondern erklären wie genau das Funktioniert, das mit den Kommazahlen?
P.S.: Das ist keine Hausaufgabe!! Ich möchte einfach nur wen beindrucken doch sitze nun fest.

Dankeschön im Vorraus
 
Beste Antwort
Hallo du hast den Datentyp Intager gewählt. Intager ist eine Ganzzahl.
Das Ergebnis ist bei dir auch wider nur ein Intager Ganzzahl.

Datentyp kommazahken ist entweder "float" mit einfacher Genauigkeit oder "double" mit doppelter Genauigkeit.

Zu mindestens gut das Ergebnis musst du float oder double benutzen.
Hallo du hast den Datentyp Intager gewählt. Intager ist eine Ganzzahl.
Das Ergebnis ist bei dir auch wider nur ein Intager Ganzzahl.

Datentyp kommazahken ist entweder "float" mit einfacher Genauigkeit oder "double" mit doppelter Genauigkeit.

Zu mindestens gut das Ergebnis musst du float oder double benutzen.
 
Beste Antwort
Java implementiert Integer-Division, also "integer / integer = integer". Wenn du mit Float/Double rechnen willst, muss mindests einer der Operatoren ein "float"/"double" sein, "float / integer = float". Oder du verwendest direkt BigDecimal fuer arbitraere Genauigkeit.

Also dabei geht es auch darum wie Datentypen gewaehlt werden bei Operationen. Wenn du eine Operation mit nur "int"s hast, bekommst du einen "int" heraus. Wenn du einen "float" hinzufuegst, bekommst du einen "float" als Ergebnis, und wenn ein "double" dabei ist, ist es immer "double". Also Java "vergroeszert" sich nur auf den naechsten Datentypen wenn es notwendig ist. "Verkleinern" hingegen funktioniert nur mit einem Cast, also wenn du "int / float" hast, und du willst "int" als Ergebnis, musst du entweder den Operanten oder as Ergebnis selbst auf "int" casten.
 
Hallo du hast den Datentyp Intager gewählt. Intager ist eine Ganzzahl.
Das Ergebnis ist bei dir auch wider nur ein Intager Ganzzahl.

Datentyp kommazahken ist entweder "float" mit einfacher Genauigkeit oder "double" mit doppelter Genauigkeit.

Zu mindestens gut das Ergebnis musst du float oder double benutzen.
Danke dir jetzt funktioniert es, aber klar warum bin ich nicht selber darauf gekommen das wurde uns sogar erklärt...

Dankeschön für deine Hilfe!
 
Hier ist mal ein ganz einfaches Beispiel, dass deinem Kenntnisstand entsprechen sollte:

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;

public class Rechner extends JFrame implements ActionListener {

    private JFormattedTextField zahl1 = new JFormattedTextField(0.0);
    private JFormattedTextField zahl2 = new JFormattedTextField(0.0);
    private JTextField ergebnis = new JTextField();

    public Rechner() {
        JButton button = new JButton("berechne");

        setLayout(new GridLayout(2, 2));
        add(zahl1);
        add(zahl2);
        add(button);
        add(ergebnis);

        pack();
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setVisible(true);

        button.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() instanceof JButton && ((JButton) e.getSource()).getText().equals("berechne")) {
            try {
                double d1 = (double) zahl1.getValue();
                double d2 = (double) zahl2.getValue();
                double d3 = d1 / d2;
                ergebnis.setText(String.format(Locale.GERMAN, "%f", d3));
            } catch (Exception ex) {
            }
        }
    }

    public static void main(String[] args) {
        Rechner rechner = new Rechner();
    }
}
 
Java implementiert Integer-Division, also "integer / integer = integer". Wenn du mit Float/Double rechnen willst, muss mindests einer der Operatoren ein "float"/"double" sein, "float / integer = float". Oder du verwendest direkt BigDecimal fuer arbitraere Genauigkeit.

Also dabei geht es auch darum wie Datentypen gewaehlt werden bei Operationen. Wenn du eine Operation mit nur "int"s hast, bekommst du einen "int" heraus. Wenn du einen "float" hinzufuegst, bekommst du einen "float" als Ergebnis, und wenn ein "double" dabei ist, ist es immer "double". Also Java "vergroeszert" sich nur auf den naechsten Datentypen wenn es notwendig ist. "Verkleinern" hingegen funktioniert nur mit einem Cast, also wenn du "int / float" hast, und du willst "int" als Ergebnis, musst du entweder den Operanten oder as Ergebnis selbst auf "int" casten.
Auch dir danke für deine Antwort und Hilfe!
Hier ist mal ein ganz einfaches Beispiel, dass deinem Kenntnisstand entsprechen sollte:

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;

public class Rechner extends JFrame implements ActionListener {

    private JFormattedTextField zahl1 = new JFormattedTextField(0.0);
    private JFormattedTextField zahl2 = new JFormattedTextField(0.0);
    private JTextField ergebnis = new JTextField();

    public Rechner() {
        JButton button = new JButton("berechne");

        setLayout(new GridLayout(2, 2));
        add(zahl1);
        add(zahl2);
        add(button);
        add(ergebnis);

        pack();
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setVisible(true);

        button.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() instanceof JButton && ((JButton) e.getSource()).getText().equals("berechne")) {
            try {
                double d1 = (double) zahl1.getValue();
                double d2 = (double) zahl2.getValue();
                double d3 = d1 / d2;
                ergebnis.setText(String.format(Locale.GERMAN, "%f", d3));
            } catch (Exception ex) {
            }
        }
    }

    public static void main(String[] args) {
        Rechner rechner = new Rechner();
    }
}
Lieben, Lieben Dank für deine Mühe und Antwort aber ich verstehe leider nicht zu 100% was du da geschrieben hast.

Troztdem Danke 🙂
 
Auch dir danke für deine Antwort und Hilfe!

Lieben, Lieben Dank für deine Mühe und Antwort aber ich verstehe leider nicht zu 100% was du da geschrieben hast.

Troztdem Danke 🙂
Lass dich nicht von etwas auführlichem Code verwirren, letztendlich handelt es sich um eine Reihe einfacher Befehle.

Der Zauber der Berechnung finder im try-catch Block statt. Alles andere konfiguriert und steuert die UI.
Geh den Block mal Zeile für Zelle durch. Ich bin sicher, dass du dann verstehst, was dort passiert.
Und schlag nach was ein JFormattedTextfield ist.
 
Lass dich nicht von etwas auführlichem Code verwirren, letztendlich handelt es sich um eine Reihe einfacher Befehle.

Der Zauber der Berechnung finder im try-catch Block statt. Alles andere konfiguriert und steuert die UI.
Geh den Block mal Zeile für Zelle durch. Ich bin sicher, dass du dann verstehst, was dort passiert.
Und schlag nach was ein JFormattedTextfield ist.
Mache ich mal Danke euch! 🙂
 

Zurück
Oben