Bruch erstellen - Von Int zu Double Ergebnis

Edward

Mitglied
Hallo ich schreibe grade eine Klasse Bruch mit der man mit Brüchen arbeiten soll.
Bisher hab ich folgendes Coding:
Code:
public class Bruch {

   private int zaehler;
   private int nenner;

   public Bruch(int pZaehler, int pNenner) {

       this.zaehler = pZaehler;
       this.nenner = pNenner;

   }

   public double wert() {

       double ergebnis;

       ergebnis = zaehler/nenner;

       return ergebnis;

   }

   public void kehrwert() {

       int z = this.zaehler;
       int n = this.nenner;

       this.zaehler = n;
       this.nenner = z;

   }

}

Wenn ich nun einen Bruch erzeuge

Code:
Bruch b1 = new Bruch (2,3);

und die Methode folgende Methode anwende bekomme ich als Ergebnis 0.0 in der Konsole:

system.out.println(b1.wert());

Warum? Was hab ich falsch gemacht?
 
Weil 2/3 eine Integerdivsion ist bei der das Ergebnis grundsätzlich abgerundet wird. 2 / 3 = 0,6666.. = (abgerundet) 0.
Um ein richtiges Ergebnis zu bekommen musst du entweder Nenner, Zähler oder beide zu einer Gleitkommazahl casten.

Als kleines Beispiel:
Java:
int nr1 = 2;
int nr2 = 3;

double erg = nr1 / (double) nr3;
 
Weil 2/3 eine Integerdivsion ist bei der das Ergebnis grundsätzlich abgerundet wird. 2 / 3 = 0,6666.. = (abgerundet) 0.
Um ein richtiges Ergebnis zu bekommen musst du entweder Nenner, Zähler oder beide zu einer Gleitkommazahl casten.

Als kleines Beispiel:
Java:
int nr1 = 2;
int nr2 = 3;

double erg = nr1 / (double) nr3;
Danke für die Antwort! Warum hat es nicht gereicht das
Code:
ergebnis
als double zu deklarieren?
Und noch eine Sache: Könntest du mir zeigen wie man eine Exception schreibt für den Fall das man eine Division durch 0 macht?
 
Naja weil im Prinzip folgendes passiert:
double = (double) (int / int). Wie du siehst steht in der letzten Klammer eine Integerdivision. Und die kann zu double gecastet werden oder nicht. 0 bleibt 0.

Fehlerbehandlung mit Exceptions würde ich dir nicht empfehlen, da es fehlerbehaftet und langsam ist.
Prüf lieber vorher ob dein Nenner == 0 ist.
Also in der Art:
Java:
if(nenner == 0) {
     // Ausgabe eines Fehlers
}

Wenn du es unbedingt mit einer Exception machen wollen würdest könntest du es so machen:
Java:
try{
    // berechne
} catch(ArithmeticException e){
   // Fehlerausgabe
}
 
Fehlerbehandlung mit Exceptions würde ich dir nicht empfehlen, da es fehlerbehaftet und langsam ist.
Prüf lieber vorher ob dein Nenner == 0 ist.
Also in der Art:
Java:
if(nenner == 0) {
     // Ausgabe eines Fehlers
}
Und wie sähe die Ausgabe eine Fehlers aus, wenn nicht mit Exceptions? 😉
 
Und die Methode gibt dann 0 zurück und das Programm rechnet dann fleißig mit 0 weiter und der Nutzer merkt nichts, weil er auf die GUI und nicht die Konsole achtet? 😉
Bin jetzt einfach mal davon ausgegangen, dass es sich nicht um eine GUI handelt. Wenn es sich doch um eine GUI handelt sollte man den Benutzer natürlich mit einer Fehlermeldung via Dialog o.ä. aufmerksam machen 😉
 
Noch nie was von Exceptions sollten nicht den Programmfluss steuern gehört????
Eben, deshalb sag ich ja, durch 0 teilen ist auf Ebene des Bruchs ein Fehler des Programierers (=Exception) und kein Programmfluss mehr.

Oder gehört es für dich zu einem Bruch dazu, dass man durch 0 teilt?
Und wenn Ja: wie sieht denn die korrekte Reaktion auf 1/0 aus, wenn man keine Exceptions benutzt?
 
Ich stelle einfach mal folgendes in den Raum, vielleicht lerne ich ewas dabei!
Java:
class Bruch {

    public static void main(String[] args) {
        Bruch b1 = new Bruch(500, 55);
        System.out.println("b1 = " + b1);
        System.out.println("b1 = " + b1.kuerzen());
        System.out.println("b1 = " + b1.kuerzen());
        System.out.println("b1 = " + b1.div(5));
        System.out.println("b1 = " + b1.kuerzen());
        System.out.println("b1 = " + b1.kuerzen());
        System.out.println("b1 = " + b1.div(0));
    }

    long z;
    long n;

    Bruch(long z, long n) {
        this.z = z;
        this.n = n;
    }

    long ggT_old() {
        if (z == 0) {
            return n;
        }
        long a = z;
        long b = n;
        while (b != 0) {
            if (a > b) {
                a -= b;
            } else {
                b -= a;
            }
        }
        return a;
    }

    Bruch kuerzen() {
        long ggt = ggT_old();
        if (ggt != 0) {
            z /= ggt;
            n /= ggt;
        }
        return this;
    }

    Bruch div(long l) {
        if (l == 0) {
            return null;
        }
        z /= l;
        return this;
    }

    @Override
    public String toString() {
        return "( " + z + " / " + n + " )";
    }

}

Hier geht es mir einmal nicht um Geschwindigkeit, sondern um Rückgabewerte und so ewas.
 
Die Klasse hat so einige Probleme...

Java:
Bruch b = new Bruch(1,5)
assert b.equals(b.div(2));
assert b.equals(new Bruch(0,0)); //Wenn equals korrekt implementiert wäre...
 
Naja weil im Prinzip folgendes passiert:
double = (double) (int / int). Wie du siehst steht in der letzten Klammer eine Integerdivision. Und die kann zu double gecastet werden oder nicht. 0 bleibt 0.

Fehlerbehandlung mit Exceptions würde ich dir nicht empfehlen, da es fehlerbehaftet und langsam ist.
Prüf lieber vorher ob dein Nenner == 0 ist.
Also in der Art:
Java:
if(nenner == 0) {
     // Ausgabe eines Fehlers
}

Wenn du es unbedingt mit einer Exception machen wollen würdest könntest du es so machen:
Java:
try{
    // berechne
} catch(ArithmeticException e){
   // Fehlerausgabe
}

Ja stimmt das ergibt Sinn mit dem double Danke!
Wegen Exceptions: Es geht tatsächlich nur darum das mal gemacht zu haben. Lerne grad die Grundlagen 🙂
Und eine Division durch 0 bei Brüchen abzufangen schien mir als einfaches Beispiel mit Try Catch Final usw. zu arbeiten 🙂
 

Zurück
Oben