possible loss of precision

Status
Nicht offen für weitere Antworten.

Java Student

Mitglied
Hallo!
So, mein zweiter Post!(Mein erster Post war noch als Gast)

Und ich hab' auch gleich mal eine Frage:

Bei einer Berechnung soll der Computer z.B. 17%5 rechnen. Das Ergebnis ist ja der Rest, also 2.
17 und 5 sind double, ebenso wie der Rest. Diesen Rest möchte ich nun in einen Puffer schreiben lassen.
Code:
 ...
double a = 17;
double b = 5;
double Rest;
char [] puffer = new char(20);
...
Rest=a%b;

puffer[j]=Rest;

Diesen Puffer lasse ich dann am Ende auslesen.

Nun kommt aber die Fehlermeldung, dass es einen möglichen Verlust an Präzision geben könnte. Der Computer verlangt eine char-Variable.
Wie muss ich den Quelltext umwandel, dass der Rest in den Pufferspeicher geschrieben wird?

Da der Rest ein double ist, wird bei normaler Ausgabe(System.out.print(""+Rest);) immer 2.0 angezeigt.
Für meine Berechnungen brauche ich aber nach Möglichkeit nur die Zahl 2 ohne Nachkommastellen.


Mfg[/code]
 
R

Roar

Gast
das: new char(20);
lässt sich eh schonmal garnich kompilieren ;)
warum machst du aus deinen a b und Rest keine ints?
 

SnooP

Top Contributor
der Modulo-Operator gilt nur für integers... eine andere Interpretation macht auch keinen Sinn, da Modulo ja der Rest einer ganzzahligen Division ist ;) ... wenn man jetzt reele Zahlen nimmt (also doubles) kommt logischerweise "Loss of Precision" zustande, da hier dann die Kommastellen entsprechend abgeschnitten werden...
bei reelen Zahlen gibt es bei 17/5 auch keinen Rest ;)

Wenn du sowieso nur die ganzen Zahlen haben möchtest, kannst du die double-Werte vorher auf Integer casten: (int)a % (int) b
 

Java Student

Mitglied
Roar hat gesagt.:
das: new char(20);
lässt sich eh schonmal garnich kompilieren ;)
warum machst du aus deinen a b und Rest keine ints?

Ich hatte den Quelltext falsch abgeschrieben, im Programm ist es schon richtig.



bei reelen Zahlen gibt es bei 17/5 auch keinen Rest
Ok, du hast recht, aber der Computer packs trotzdem!!!

Aber selbst wenn ich "int" nehme, gibt's immer noch eine Fehlermeldung, wenn ich den Rest dann in den Puffer schreiben lasse.

"possible loss of precision"
found: int
required: char

Was muss ich tun?


Mfg
 
R

Roar

Gast
du musst (char) Rest; schreiben, ic hfrag mich nur wa das bringen soll, sollte das puffer array nicht lieber nen int array sein?
 

Java Student

Mitglied
Danke für eure Hilfe! :D

Ich hab die char jetzt in int umgewandelt. Nur leider läuft jetzt der Pufferspeicher über!
Am besten ich fange noch mal ganz von vorne an.
Ich will ein Programm schreiben, das mir Dezimal in Oktalzahlen umwandelt.
Diesen Puffer habe ich auch schon angewendet, als ich ein Programm zur Umwandlung von Dezimal in Dualzahlen geschrieben habe.


Wenn ich statt des Puffers die einzelnen Ergebnisse ausgeben lasse, dann kommt das richtige heraus, jedoch verkehrt herum.
Wenn ich die Variante mit dem Puffer versuche, kommen nun aber für die gleichen Rechnungen völlig falsche Zahlen heraus.(zB. für 64 => 14848)

Wo steckt der Fehler?


Edit: Problem hat sich erledigt. Ich habe es auf andere Weise gelöst.




Mfg
 

Java Student

Mitglied
Nun hat sich ein anderes Problem ergeben, das ich auch nach längerer Suche im Forum nicht lösen konnte.
Um Platz zu sparen poste ich hier in mein altes Thema.

Ich habe folgenden Quellcode(leicht gekürzt):
Code:
import java.awt.Choice;
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.*;
import java. applet.*;

public class Programm extends Applet
implements ActionListener, ItemListener
{
   public void init()
   {
      setLayout(null);
      setSize(700, 400);
      setBackground(Color.gray);
      Fenster01();
   }
   
   public void Fenster01()
   {

      Button b = new Button("Button2");
        b.setBounds(50, 150, 170, 30);
        b.addActionListener(this);
        add(b);

    }
     
    public void actionPerformed(ActionEvent e)
    {
      String cmd = e.getActionCommand();

      if(cmd.equals("Button2"))
      {
        Weiterleitung();
      }

    }

   public void Weiterleitung()
     {
      Choice auswahl = new Choice();
      
      auswahl.addItem("Auswahl1");
      auswahl.addItemListener(this);
      auswahl.addItem("Auswahl2");
      auswahl.addItem("Auswahl3");
      auswahl.setBounds(500, 170, 120, 10);
      add(auswahl);
      
      }
      
      public void itemStateChanged(ItemEvent e)
    {
      Object obj = e.getSource();
        if(obj == auswahl)                                              
        {  String system = e.getSelectedItem();
           if(system.equals("Auswahl1"))
           setBackground(Color.red);
           repaint();
        }
    }
    
}

Der Computer kann "auswahl" in "public void itemStateChanged(ItemEvent e)" nicht finden!
Wie muss ich "auswahl" deklarieren, damit der Computer in jeder beliebigen Methode darauf zugreifen kann?


Mfg
 

SnooP

Top Contributor
Choice auswahl ist ein Auswahlsteuerelement was von überall her erreicht werden soll. Sinnvollerweise benutzt man hier Objektvariablen (oder auch Membervariablen) um "global" innerhalb deiner Klasse auf die Variable zugreifen zu können - das bedeutet, dass du in der Methode "Weiterleitung" nicht Choice auswahl = new Choice(); schreibst, sondern:
auswahl = new Choice();

und am Anfang deiner Klasse außerhalb einer Methode die Objektvariable Auswahl deklarierst:
Choice auswahl;

Wichtiger Hinweis für die Zukunft... bei Zugriffen auf derlei Objekte kann es häufig vorkommen, dass diese noch nicht initalisiert wurden - sprich auswahl hat den Anfangswert eines jeden Objekts in Java: null.
Ein Zugriff auf ein Attribut oder eine Methode von auswahl - z.B. auswahl.addItem(...) führt zu einer NullPointerException, da das Objekt noch gar nicht da ist (die new-Anweisung fehlte)...
Bei sowas immer gucken, dass an geeigneter Stelle auch das Objekt per new erstellt wird, bevor man dann auf jenes zugreift.
 

Java Student

Mitglied
Morgen,

ich hätte da noch eine Frage.

Der Computer soll einen Zahlenwert von einem Textfeld tf1 in einem Java-Applet einlesen, und mit diesem Wert eine Rechnung ausführen.

Den Wert lasse ich mit: "c=Integer.parseInt(tf1.getText().trim());" einlesen.

Wie kann ich nun in einem anderen Textfeld tf2 das Rechenergebnis erg ausgeben lassen?
Wobei dieses Ergebnis in einem array (puffer[l]) steht!


Mfg
 

The_S

Top Contributor
Benötigst du nur ein Element von puffer[] oder mehrere? Falls du nur eines benötigst:

Code:
tf2.setText(puffer[l]);
 

Java Student

Mitglied
Es werden mehrere Zahlen in den Puffer geschrieben und alle sollen wieder ausgegeben werden.
Mit tf2.setText(""+puffer[l]); wird immer nur eine Zahl ausgegeben.
 

Oni

Top Contributor
was ist den puffer[] für ein type?

vielleicht geht es ja so..

Code:
StringBuffer sb = new StringBuffer();
for(int i = 0; i < puffer.length; i++){
  sb.append(puffer[i]);
}
 tf2.setText(sb.toString());
 

Java Student

Mitglied
Der Puffer ist ein char.

Außerdem soll zusätlich nach der Ausgabe des Puffers in das Textfeld noch eine andere Ziffer dahinter angehängt werden.
 

Oni

Top Contributor
dann müsste so das gehen, oder wo gibt es probleme?
Code:
StringBuffer sb = new StringBuffer();
for(int i = 0; i < puffer.length; i++){
  sb.append(puffer[i]);
}

sb.append(/*noch Eine zahl*/);
tf2.setText(sb.toString());
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben