AWT GUI nimmt nur 19 Ziffern an, obwohl Max Wert von Double größer ist

Berlin_er

Mitglied
Hallo Zusammen,

ich versuche gerade eine eigene Aufgabe zu erstellen, die ich für die Schule machen muss. Dabei darf es nur Arrays, GUI, Sub-Klassen (Objektorientiertes Programmieren), Schleifen und Abfragen wie if/switch-case enthalten. Dabei dachte ich an ein Programm, dass bestimme Zahlen in Buchstaben umwandelt. D.h. , die grafische Benutzeroberfläche wird gestartet, es wird eine Zahl eingegeben, die mit einem Klick auf den Button in Buchstaben bzw. Wörter/Sätze umgewandelt wird.

Damit man lange Sätze oder Wörter bilden kann, braucht man lange Zahlen und aus dem Grund habe ich den Datentyp double statt int oder long genommen. Mein Problem ist, dass die grafische Benutzeroberfläche ab 19 Ziffern nicht mehr funktioniert. Die Zahl scheint zu lang zu sein aber genau aus dem Grund habe ich auch double genommen, dessen Maximalwert definitiv über 19 Ziffern geht. Deswegen wollte ich mal hier im Forum fragen, ob mich jemand aufklären kann.

Meine GUI und Sub-Klasse Codes befindet sich ganz unten. Falls etwas nicht verständlich sein sollte, findet ihr vor den Codes noch eine kleine Beschreibung des Programms. Wenn es trotzdem unverständlich ist, dann bitte anschreiben.
Falls die Frage aufkommt, warum ich mit AWT und nicht Swing arbeite: Ich weiß es auch nicht - wir müssen in der Schule mit AWT arbeiten.

Beschreibung:
Mein Array alphabet hat 34 Felder (inkl. Indexwert 0) und die Felder des Arrays sind mit den jeweiligen Buchstaben und Sonderzeichen belegt. Zum Beispiel alphabet[0] wäre dann ein "a".
Mit einem Klick auf den Button "Los!" wird zunächst die Zahl im Numberfield in die Instanzvariable double zahl übernommen. Dann gehts weiter mit der Sub-Klasse "Umwandeln" für die Berechnung und Übersetzung in Buchstaben/Sonderzeichen. Dazu übernehme ich zunächst die Parameterwerte der Variablen double zahl und String ergebnis aus der GUI-Klasse mithilfe eines Konstruktors in meine Instanzvariablen in der Sub-Klasse. Dann startet meine Methode "Start". Zunächst rechne ich den Rest der eingegebenen Zahl aus, indem ich die Zahl mit Modulo(%) durch 100.0 teile. Dann kürze ich die Zahl um 2 Stellen mithilfe des Restwertes. D.h. jedes Mal wird die Zahl um 2 Stellen gekürzt und es entsteht die Möglichkeit die Zahlen nacheinander in Buchstaben/Sonderzeichen umzuwandeln. Nun wird der Restwert mit den Array-Feldern verglichen und wird in den jeweiligen Buchstaben oder Sonderzeichen umgewandelt. Dieser Buchstabe oder Sonderzeichen wird dann an die Stringvariable ergebnis angekettet. Erreicht die Zahl durch die Subtraktionen 0, dann wird die selbe Prozedur durchlaufen, nur dass diesmal der Buchstabe mithilfe von .toUpperCase() großgeschrieben dargestellt wird. Wenn die Schleife beendet ist und die Zahl vollständig umgewandelt wurde, landet der Wert der Stringvariable mithilfe von return ergebnis; wieder in der GUI-Klasse und kann durch ein TextArea ausgegeben werden.

Hinweis:
Es bilden immer zwei Ziffern ein Buchstabe bzw. ein Sonderzeichen - auch einstellige Zahlen müssen als zweistellig eingegeben werden, d.h. statt 4 gibt man 04 ein.

Zum Beispiel:
Der Restwert 10 wäre: alphabet [10] -> "k"
Der Restwert 4 wäre: alphabet[4] -> "e", jedoch tragen wir die 4 mit einer 0 im GUI davor ein.

Also:
Der Restwert 04 wäre: alphabet[4] -> "e"
Das wird so gemacht, da das Programm ständig die eingegebene Zahl durch 100 teilt und dadurch nicht unterscheiden kann, ob dabei eine einstellige oder zweistellige Zahl beabsichtigt wurde. Mit der 0 vor jeder einstelligen Zahl erkennt es jedoch, ob es sich um eine einstellige oder zweistellige Zahl handelt.

Zum Beispiel:
13214 % 100 wäre 14, jedoch war der Code folgendermaßen gedacht: 13|21|4 und nicht 1|32|14.
Also würde das Programm eine andere Reihenfolge eingehen.
Aber:
132104 % 100 wäre 4 und somit würde der Code in der richtigen Reihenfolge (13|21|04) übersetzt werden.



Ich bedanke mich im Voraus und wünsche allen alles Gute für das kommende Jahr.




GUI-Klasse:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Codieren extends JFrame {
  // Anfang Attribute
  private Label lbl_Dechiffrieren = new Label();
  private Label lbl_Zahl = new Label();
  private NumberField nf_Zahl = new NumberField();
  private Label lbl_Ergebnis = new Label();
  private TextArea txt_Ergebnis = new TextArea("", 1, 1, TextArea.SCROLLBARS_BOTH);
  private Button but_Los = new Button();
  private Button but_Nochmal = new Button();
  private Button but_Beenden = new Button();
 
  String ergebnis = " ";
  double zahl;
  Umwandeln meineKlasse = new Umwandeln(ergebnis, zahl);
  // Ende Attribute
 
  public Codieren(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 530;
    int frameHeight = 472;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten
   
    lbl_Dechiffrieren.setBounds(176, 40, 147, 49);
    lbl_Dechiffrieren.setText("Dechiffrieren");
    lbl_Dechiffrieren.setAlignment(Label.CENTER);
    lbl_Dechiffrieren.setFont(new Font("Dialog", Font.BOLD, 16));
    cp.add(lbl_Dechiffrieren);
    lbl_Zahl.setBounds(24, 112, 123, 33);
    lbl_Zahl.setText("Bitte Code eingeben:");
    lbl_Zahl.setAlignment(Label.RIGHT);
    cp.add(lbl_Zahl);
    nf_Zahl.setBounds(160, 112, 337, 33);
    nf_Zahl.setText("");
    cp.add(nf_Zahl);
    lbl_Ergebnis.setBounds(24, 200, 123, 33);
    lbl_Ergebnis.setText("Ergebnis:");
    lbl_Ergebnis.setAlignment(Label.RIGHT);
    cp.add(lbl_Ergebnis);
    txt_Ergebnis.setBounds(160, 200, 337, 169);
    txt_Ergebnis.setEditable(false);
    cp.add(txt_Ergebnis);
    but_Los.setBounds(392, 160, 105, 25);
    but_Los.setLabel("Los!");
    but_Los.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        but_Los_ActionPerformed(evt);
      }
    });
    but_Los.setFont(new Font("Dialog", Font.BOLD, 12));
    cp.add(but_Los);
    but_Nochmal.setBounds(272, 384, 105, 41);
    but_Nochmal.setLabel("Nochmal!");
    but_Nochmal.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        but_Nochmal_ActionPerformed(evt);
      }
    });
    but_Nochmal.setFont(new Font("Dialog", Font.BOLD, 12));
    cp.add(but_Nochmal);
    but_Beenden.setBounds(392, 384, 105, 41);
    but_Beenden.setLabel("Beenden");
    but_Beenden.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        but_Beenden_ActionPerformed(evt);
      }
    });
    but_Beenden.setFont(new Font("Dialog", Font.BOLD, 12));
    cp.add(but_Beenden);
    // Ende Komponenten
   
    setVisible(true);
  } // end of public Codieren
 
  // Anfang Methoden
 
  public static void main(String[] args) {
    new Codieren("Codieren");
  } // end of main
 
  public void but_Los_ActionPerformed(ActionEvent evt) {
    zahl = nf_Zahl.getDouble();
    txt_Ergebnis.setText(ergebnis = meineKlasse.Start(ergebnis, zahl));
    nf_Zahl.clear();
    zahl = 0.0;                                                                                 
  } // end of but_Los_ActionPerformed
 
  public void but_Nochmal_ActionPerformed(ActionEvent evt) {
    nf_Zahl.clear();
    txt_Ergebnis.setText("");
    zahl = 0.0;
    ergebnis = "";
  } // end of but_Nochmal_ActionPerformed
 
  public void but_Beenden_ActionPerformed(ActionEvent evt) {
    System.exit(0);
  } // end of but_Beenden_ActionPerformed
 
  // Ende Methoden
} // end of class Codieren

Umwandeln (Sub-Klasse):
Java:
public class Umwandeln{
 
  public double zahl;
  public double rest;
  public String ergebnis;
 
  public String [] alphabet = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","ß","ö","ü","ä",".",",","?","!"," "};
 
  public Umwandeln(String pergebnis, double pzahl){
    ergebnis = pergebnis;
    zahl = pzahl;
  }
 
  public String Start(String ergebnis, double zahl){
   
    while (zahl >= 0) {
      rest = zahl % 100.0;
      zahl = (zahl / 100.0) - (rest / 100.0);
      if (zahl == 0) {
        ergebnis = alphabet[(int)rest].toUpperCase() + ergebnis;
        zahl -= 1.0;
      }
      else {
        ergebnis = alphabet[(int)rest] + ergebnis;
      }
      rest = 0.0;
    }
    return ergebnis;
  }
 

httpdigest

Top Contributor
aber genau aus dem Grund habe ich auch double genommen, dessen Maximalwert definitiv über 19 Ziffern geht.
Hier liegst du leider falsch. Auch ein IEEE-754 64-bit double Wert kann nur ca. 16 signifikante Dezimalstellen haben.
Natürlich kannst du absolut sehr große Zahlen repräsentieren, aber eben nicht mit mehr als ca. 16 signifikanten Stellen.
Das heißt, mit double kannst du zwar 1E38 (also eine 1 mit 38 Nullen) darstellen, aber dieser Wert hat ja auch nur eine einzige signifikante Stelle. Double kann nicht exakt den Wert 123.456.789.876.543.210.987 darstellen!
 

Robat

Top Contributor
Ich seh' momentan auch noch nicht den Sinn dahinter, warum du die Eingabe als Zahl speichern willst. Lass die Eingabe doch als String und arbeite auf dem String. Diesen kannst du doch auch immer um 2 Stellen kürzen und diese beiden Stellen dann zu einer Zahl machen.
 

Berlin_er

Mitglied
Hier liegst du leider falsch. Auch ein IEEE-754 64-bit double Wert kann nur ca. 16 signifikante Dezimalstellen haben.
Natürlich kannst du absolut sehr große Zahlen repräsentieren, aber eben nicht mit mehr als ca. 16 signifikanten Stellen.
Das heißt, mit double kannst du zwar 1E38 (also eine 1 mit 38 Nullen) darstellen, aber dieser Wert hat ja auch nur eine einzige signifikante Stelle. Double kann nicht exakt den Wert 123.456.789.876.543.210.987 darstellen!
Gibt es denn keine Möglichkeit eine Zahl wie 123.456.789.876.543.210.987 darzustellen?
 

Berlin_er

Mitglied
Ich seh' momentan auch noch nicht den Sinn dahinter, warum du die Eingabe als Zahl speichern willst. Lass die Eingabe doch als String und arbeite auf dem String. Diesen kannst du doch auch immer um 2 Stellen kürzen und diese beiden Stellen dann zu einer Zahl machen.
Du meinst also das Ganze nur umgekehrt? Daran habe ich auch gedacht, jedoch muss ich mit Char arbeiten, um die Zeichenkette in Stücke zu teilen, damit ich das Ganze in Zahlen umwandeln kann. Jedoch darf ich kein Char mit in die Aufgabe nehmen, da wir das Thema in der Schule übersprungen haben..
 

Robat

Top Contributor
Warum musst du da mit chars arbeiten? String#substring(int) liefert beispielsweise auch wieder einen String. Diese kannst du dann mit Integer#parseInt(String) in eine Zahl umwandeln.

Und mal unter uns: Wer überspringt denn 'char' aber bringt seinen Schülern GUI-Programmierung bei? o_O Zumal beim Datentyp char jetzt nicht so viel können muss
 

Berlin_er

Mitglied
Warum musst du da mit chars arbeiten? String#substring(int) liefert beispielsweise auch wieder einen String. Diese kannst du dann mit Integer#parseInt(String) in eine Zahl umwandeln.

Und mal unter uns: Wer überspringt denn 'char' aber bringt seinen Schülern GUI-Programmierung bei? o_O Zumal beim Datentyp char jetzt nicht so viel können muss

Char, weil ich im Internet auf charAt() gestoßen bin, womit es funktionieren würde. Wir machen in der Schule nur das nötigste, um die Prüfungsvorgaben für die Abiturprüfungen 2019 zu decken. Ist irgendwie blöd aufgebaut, aber naja..
Werde mir String#substring(int) und Integer#parseInt(String) anschauen, vielen Dank für den Hinweis!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
TheWhiteShadow JavaFX ScrollPane nimmt nicht genug platz ein AWT, Swing, JavaFX & SWT 3
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
Seikuassi Swing JTextField nimmt kein Einfügen (Strg+V) an AWT, Swing, JavaFX & SWT 4
Kenan89 Border nimmt Platz AWT, Swing, JavaFX & SWT 17
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
F Swing timer nimmt delay nicht an AWT, Swing, JavaFX & SWT 2
Knizz Button nimmt komplettes Fenster ein AWT, Swing, JavaFX & SWT 10
V JTextField nimmt keine Eingaben an, nach nachträglichem setVisible des JWindows AWT, Swing, JavaFX & SWT 4
J Swing JScrollPane nimmt das JPanel zum Zeichnen nicht an AWT, Swing, JavaFX & SWT 5
S JTable nimmt TableModel nicht an AWT, Swing, JavaFX & SWT 4
J ActionListener nimmt keine for()-Schleife? AWT, Swing, JavaFX & SWT 4
M JList nimmt keine Selektierung mehr an AWT, Swing, JavaFX & SWT 7
G JComboBox nimmt Auswahl nicht an AWT, Swing, JavaFX & SWT 5
D textfeld mit 0 bis n ziffern AWT, Swing, JavaFX & SWT 11
G Gibts ne Klasse zur Anzeige von Ziffern? AWT, Swing, JavaFX & SWT 4
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
B Zugriff auf JFrame obwohl die Klasse abgeleitet ist AWT, Swing, JavaFX & SWT 3
O Swing Button löst zweimal aus, obwohl nur einmal geklickt AWT, Swing, JavaFX & SWT 3
martinyyyy AWT Parameter erzeugen NullpointerException obwohl sie vorhanden sind? AWT, Swing, JavaFX & SWT 4
S Eventhandling obwohl Fenster nicht im Fokus AWT, Swing, JavaFX & SWT 5
T Look and Feel ändern geht nicht, obwohl es geht. AWT, Swing, JavaFX & SWT 2
Z bei kleinen Buttons verschwindet Schrift, obwohl Platz wäre AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben