Dezimalzahl in Bruch Umwandeln und Kürzen

Jakonfire

Mitglied
Das Programm soll Dezimalzahlen in Brüche Umwandeln und Kürzen. Beim Umwandeln hat sich irgendwo ein Fehler eingeschlichen und das Kürzen funktioniert leider nicht. Vielleicht kann mir jemand einen Tipp geben. Danke!

Arguments: parseDouble "-0.5 1.25 3.42 0.0"

Ausgabe: -50/100;125/100;341/100;0/1;

Erwartete Ausgabe: -1/2;5/4;171/50;0/1

Java:
    public static String parseToString(double[] werte) {
        double[] eingabe = new double[werte.length];
        int laenge = eingabe.length;
        String ausgabe = "";

        double zaehler = 0;
        int ganze, gesamtzaehler = 0, nenner = 100, a, b;

        for (int i = 0; i < laenge; i++) {

            ganze = (int) werte[i];
            zaehler = (int)(100 * (werte[i] - ganze));
            gesamtzaehler = (int)(ganze * 100 + zaehler);

            a = gesamtzaehler;
            b = nenner;
            int ggt = 1;

            for (int k = 100; k > 1; k--) {
                if ((a % k) == 0 && (b % k) == 0) {
                    ggt = k;
                } else {
                    ggt = 1;
                }
            }



            gesamtzaehler = gesamtzaehler / ggt;
            nenner = nenner / ggt;


            if (gesamtzaehler == 0) {
                nenner = 1;
            }

            ausgabe = ausgabe + (gesamtzaehler) + "/" + (nenner) + ";";
        }
        return ausgabe;
    }

    }
 
Java:
for (int k = 100; k > 1; k--) {
                if ((a % k) == 0 && (b % k) == 0) {
                    ggt = k;
                } else {
                    ggt = 1;
                }
            }

Das Problem liegt m.E. hier, du musst die Schleife verlassen, wenn du den ggt gefunden hast, du läufst doch rückwärts. Wenn du sie nicht verlässt, dann wird der ggt immer kleiner.
 
Java:
for (int k = 100; k > 1; k--) {
                if ((a % k) == 0 && (b % k) == 0) {
                    ggt = k;
                } else {
                    ggt = 1;
                }
            }

Das Problem liegt m.E. hier, du musst die Schleife verlassen, wenn du den ggt gefunden hast, du läufst doch rückwärts. Wenn du sie nicht verlässt, dann wird der ggt immer kleiner.
Also sowohl bei if und else in beiden Fällen break?
 
Also sowohl bei if und else in beiden Fällen break?
Ne der else Fall macht überhaupt garkeinen Sinn. Du initialisierst den ggt ja schon mit 1, er bleibt 1, wenn kein anderer ggt gefunden wird. Du brauchst nur den if Fall, und durch setzt du einen break hin.

Aber wieso kommt z.B. auch 341 anstelle von 342?
Das kann ich dir spontan nicht sagen, aber ich vermute es hängt irgendwie mit deinem Gewurschtel aus a, b, ganze, gesamtzaehler, zaehler und nenner zusammen. Das sind viel zu viele Variablen für diese Aufgabe. Eigentlich brauchst du nur einen nenner, einen zaehler und den ggt.
 
Ne der else Fall macht überhaupt garkeinen Sinn. Du initialisierst den ggt ja schon mit 1, er bleibt 1, wenn kein anderer ggt gefunden wird. Du brauchst nur den if Fall, und durch setzt du einen break hin.


Das kann ich dir spontan nicht sagen, aber ich vermute es hängt irgendwie mit deinem Gewurschtel aus a, b, ganze, gesamtzaehler, zaehler und nenner zusammen. Das sind viel zu viele Variablen für diese Aufgabe. Eigentlich brauchst du nur einen nenner, einen zaehler und den ggt.
Sieht jetzt so aus aber funktioniert nicht mit dem ggt: -50/100;5/4;342/2;0/1;

Die 341 konnte ich lösen das lag am casten auf int


Java:
    public static String parseToString(double[] werte) {
    double [] eingabe = new double [werte.length];
    int laenge = eingabe.length;
    String ausgabe = "";
    
    double  zaehler = 0;
    int ganze, gesamtzaehler = 0, nenner = 100;
    
    for (int i=0; i < laenge; i++){

    ganze = (int)werte[i];
    zaehler = (100*(werte[i] - ganze));
    gesamtzaehler = (int)(ganze * 100 + zaehler);
    
    int ggt = 1;
    
    
    for (int k = gesamtzaehler; k > 1; k--) {
        if ((gesamtzaehler % k) == 0 && (nenner % k) == 0) {
                ggt = k;
                break;
            }
            else {
                ggt=1;
            }   
    }
    gesamtzaehler = gesamtzaehler/ggt;
    nenner = nenner/ggt;
    
    
    if (gesamtzaehler == 0){
        nenner = 1;
    }
    
    ausgabe = ausgabe + (gesamtzaehler) + "/" + (nenner) + ";";
    }
    return ausgabe;     
    }
    
}
 
Am Einfachsten ist es, es auszuprobieren:
Java:
public class Fac {
    public static String convert(float f, int factor) {
        boolean neg = f < 0;
        if (neg) {
            f = -f;
        }
        float min_e = Math.abs(f - (int) (f - 1));
        int min_i = 1;
        for (int i = 2; i <= factor; i++) {
            float e = Math.abs(f - (float) Math.round(f * i) / i);
            if (e < min_e) {
                min_e = e;
                min_i = i;
            }
            if (e < 0.01) {
                break;
            }
        }
        return (neg ? "-" : "") + Math.round(f * min_i) + " / " + min_i;
    }

    public static void main(String[] args) {
        System.out.println(convert(-1.333f, 1000));
        System.out.println(convert((float) Math.PI, 1000));
        System.out.println(convert(-33.33f, 1000));
    }
}
 
Sieht jetzt so aus aber funktioniert nicht mit dem ggt
1. Der else Zweig ist immernoch unnötig.
2. Du brauchst keinen zaehler, ganze + gesamtzaehler. Eine Zahl mit 2 Nachkommastellen mit 100 multipliziert ist bereits dein Gesamtzaehler. Du hast dir hier unnötig Arbeit gemacht.
3. Schmeiß mal das eingabe-Array raus, du verwendest das nicht. Die laenge in der Schleife kannst du direkt durch werte.length ersetzen.
4. Du siehst das manche Fälle funktionieren, manche nicht. Überlege dir doch mal, was der Unterschied ist.
4a. Der erste nicht funktionierende Fall ist -50/100. Die Ursache liegt hier for (int k = gesamtzaehler; k > 1; k--) {, dein gesamtzaehler ist negativ, was bedeudet das für die Schleife? In deiner ersten Version hattest du die 100 hier stehen, was hat dich dazu bewegt das zu ändern?
4b. Der zweite nicht funktionierende Fall ist 342/2, debug das doch mal, wo sind die Werte anders, als du erwartest?
 
Zuletzt bearbeitet:
Das Programm soll Dezimalzahlen in Brüche Umwandeln und Kürzen. Beim Umwandeln hat sich irgendwo ein Fehler eingeschlichen und das Kürzen funktioniert leider nicht. Vielleicht kann mir jemand einen Tipp geben. Danke!
Die Aufgabe lautet eine Programm erstellen, dass als Eingabe Dezimalzahlen und als Ausgabe gekürzte Brüche hat.

1) Am Besten erstellt man zuerst eine Klasse Bruch. Der Konstruktor hat eine double als Parameter.
2) Die Umwandlung einer reellen Zahl in einen Bruch sieht so aus:
z.B. Wert = 2.25 --> [2.25 * 10^2 / 10^2] --> [225/100] --> kürzen [9/4]
Also wir benötigen folgenden Variablen
Die Position des Kommas, die Anzahl der Ziffern und die Ziffern als Zahl.
idComma = 1; numDigits = 3; digits = 225
--> digits / 10^(numDigits-idComma)


Wegen der Ungenauigkeit von double, ist es nicht zu empfehlen, mittels Berechnungen zu arbeiten.
Besser man Wandelt den Wert in einen String um. Dann ist es ein Leichtes ,die obigen Variablen zu berechnen.
Hier ist noch Anzumerken, die Umwandlung nicht mit Double.toString() zu machen, da dort bei großen Zahlen oder bei vielen Nachkommastellen automatisch die Exponential schreibweise verwendent wird. z.B. 2.00034011E-6
Besser ist es, String.format("%.17f", wert) zu verwenden.
3) Nachdem Zähler und Nenner erweitert berechnet wurden braucht man noch eine Funktion zum Kürzen.
4) Methode String toString() schreiben.
5) Methode doubel toDouble() schreiben.

Das Testprogramm ist jetzt sehr einfach zu erstellen.
[CODE lang="java" title="Umwandlung double in Bruch"]public class TestBruch {
public static void main(String[] args) {
double[] test = { 2.25, -2000003430, 23, -.142, 24.4 };
for (int i = 0; i < test.length; i++) {
Fraction f = new Fraction(test);
System.out.println(test + "\t" + f + " = " + new Fraction(f.toDouble()));
}
}
}[/CODE]
 

Neue Themen


Zurück
Oben