Java Simple Rechenaufgabe

fricken.god

Newbie
Registriert
Mai 2019
Beiträge
2
Hallo zusammen,
Wir haben vor kurzem mit Java angefangen und haben eine kleine Rechenaufgabe als Übung für die Klausur bekommen.
Ich hatte bis jetzt keine Probleme aber bei 11/3 habe ich 3 rausbekommen und nicht 3,66667. Habe es deswegen mit double versucht aber ich bekomme immer noch 3 als Ergebnis.

Java:
public class Rechenarten
{
    public static void main(String[] args) {
        
        double ergebnis;
        int a=11;
        int b=3;
        
        ergebnis = a+b;
        System.out.println(a + "+" + b + "=" + ergebnis + "\n");
        
        ergebnis = a-b;
        System.out.println(a +"-" + b+ "=" + ergebnis + "\n");
        
        ergebnis = a*b;
        System.out.println(a + "*" + b+ "=" + ergebnis + "\n");
        
        ergebnis = a/b;
        System.out.println(a + "/" + b + "=" + ergebnis + "\n");

        ergebnis = a%b;
        System.out.println(a + "%" + b + "=" + ergebnis + "\n");
        
        
    }
}
 
du teilst int durch int. Daraus wird dann logischerweise ein int.
Wenn du den castest, dann kommen da nicht plötzlich Informationen dazu, die davor verworfen wurden.
 
  • Gefällt mir
Reaktionen: fricken.god
Du musst den Datentyp von a und b in double ändern.
ergebnis = (double)a/b
 
  • Gefällt mir
Reaktionen: fricken.god
esb315 schrieb:
ergebnis = (double)a/b
da teilst du jetzt aber auch double durch int. Kann in dem speziellen Fall klappen, ist aber eigentlich auch nicht richtig.
 
  • Gefällt mir
Reaktionen: fricken.god
Hmm. Na gut. Dann aber so:
ergebnis = ((double)a)/((double)b);

Quick and dirty.
 
  • Gefällt mir
Reaktionen: fricken.god
Schreib statt int einfach überall double hin. Mit den Feinheiten, wie und wann man welchen Datentyp benutzt, kannst Du dich später beschäftigen (die Erkenntnis kommt dann teilweise auch von alleine).
 
  • Gefällt mir
Reaktionen: fricken.god
Nixdorf schrieb:
Doch, ist es. Nach den Java-Sprachregeln
ok, hast recht. Bin da eher ein Cast-Schisser ;)

Aber wäre sein Beispiel denn überhaupt korrekt, oder würde man hier nicht auch wieder das Ergebnis erst casten.
Da müsste doch noch ne Klammer um den double cast von a, oder? (Grad keine Lust mehr, das auszuprobieren :D )
 
Betrachtet man die Zahlen an sich, dann geht der Spaß auch ohne explizites Casten:
Code:
jshell> 11/3
$1 ==> 3

jshell> 11/3.0
$2 ==> 3.6666666666666665

jshell> 11.0/3
$3 ==> 3.6666666666666665

jshell> 11/3d
$4 ==> 3.6666666666666665

jshell> 11d/3
$5 ==> 3.6666666666666665

Mit expliziten Casts:
Code:
jshell> (double) (11/3)
$1 ==> 3.0

jshell> (double) 11/3
$2 ==> 3.6666666666666665

jshell> 11/(double) 3
$3 ==> 3.6666666666666665

Die JShell ist super, um solche Sachen Mal eben auszuprobieren.
 
  • Gefällt mir
Reaktionen: fricken.god
rg88 schrieb:
Aber wäre sein Beispiel denn überhaupt korrekt, oder würde man hier nicht auch wieder das Ergebnis erst casten.
Wie oft du dann noch zusätzlich castest, ist dann auch egal. Entweder ist der Ausdruck eine Integer-Division, weil beide Argumente Integer sind. Dann kommt eine glatte 3 aus, und die wird dann nach Float gecastet (ist dann also "3.0"). Oder irgendwo wird eines der Argumente VOR der Division Float und dann wird es eine Integer-Division. Dann kommt "3.6666666666666665" raus, wie in der jshell zu sehen, und das landet dann direkt im Float ohne weiteren Cast.

Übrigens ist das auch nicht so völlig "logisch", wie es oben steht. Es ist halt in den Sprachen so definiert. Man hätte ja auch definieren können, dass linksassoziativ die Zuweisung spezifiziert, dass wegen des Zieltyps Float in dem Befehl alle Argumente zunächst nach Float gecastet werden. Das könnte man aus menschlicher Sichtweise ja genau so als "logisch" bezeichnen.

Die üblichen Regeln für die Operator-Rangfolge sehen aber solche komplexeren Regeln nicht vor. Daher wird die Division zunächst für sich als Integer-Division ausgewertet, und erst danach wird überhaupt klar, dass man am Ende für das Ablegen in der Zielvariablen ein Float verwendet. So nach dem Motto "Das hättest du mir ja auch vorher sagen können, dass du Platz für die Fließkommazahl hast. Tut mir leid, jetzt hab ich das mit Ganzzahlen gerechnet." Und der eine notwendige Cast ist genau dieses "vorher sagen".
 
  • Gefällt mir
Reaktionen: fricken.god und rg88
Zurück
Oben