Prozente werden falsch berechnet

DominikDoom

Mitglied
Hallo Leute,

ich will eine Art Wahlzettel programmieren, bei dem man für verschiedene Parteien abstimmen kann. Jedes Mal, wenn eine Stimme hinzukommt, soll auch der prozentuale Anteil dieser Partei an den Gesamtstimmen aktualisiert werden.
Das Problem ist nun, dass bei der ersten Abstimmung alles funktioniert wie es soll und eine Partei nun 100% hat. Wird allerdings bei einer anderen Partei eine 2. Stimme abgegeben, wird der Prozentwert bei beiden zu 0% anstatt 50%. Die Stimmen für die einzelnen Parteien sowie der Gesamtwert bleiben dabei korrekt erhalten, nur das errechnete Prozentergebnis wird immer zu 0, obwohl es das nicht sollte.
Java:
public void percentUpdate() {
       
        totalCount = spdCount + cduCount + grueneCount + linkeCount + fdpCount;
        cduPercent = (cduCount / totalCount) * 100;
        spdPercent = (spdCount / totalCount) * 100;
        gruenePercent = (grueneCount / totalCount) * 100;
        linkePercent = (linkeCount / totalCount) * 100;
        fdpPercent = (fdpCount / totalCount) * 100;
       
       
        cduBar.setValue(cduPercent);
        spdBar.setValue(spdPercent);
        grueneBar.setValue(gruenePercent);
        linkeBar.setValue(linkePercent);
        fdpBar.setValue(fdpPercent);
    }

cduBar etc. sind Progressbars, mit denen der Prozentanteil angezeigt wird.
Die void percentUpdate() wird beim Drücken eines zur jew. Partei gehörenden Buttons abgerufen:
Java:
private void spdButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
        spdCount ++;
        spdOutput.setText(spdOutput.getText().valueOf(spdCount));
        percentUpdate();
}                                        

private void cduButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
        cduCount ++;
        cduOutput.setText(cduOutput.getText().valueOf(cduCount));
        percentUpdate();
}
Nirgends wird einer dieser Prozentwerte absichtlich auf 0 gesetzt, außer bei der Initalisierung, die allerdings definitiv nicht beim drücken der Buttons abgerufen wird.
Ich habe jetzt schon eine ganze Weile herumprobiert, konnte aber keine Lösung finden.
So sieht das Programm aus:
2016-09-09 20_14_18-.png
 

Thallius

Top Contributor
Wenn du mit integer rechnest gibt es keine nachkommastellen.

Rechne doch einmal

(1 / 2) * 100

Das gibt dann 1 / 2 = 0 * 100 = 0

Du musst die Formel umstellen, das du erst mit 100 multiplizierst und dann durch die Anzahl teilst.

Gruß

Claus
 

DominikDoom

Mitglied
Oh Mann...
Da hab ich wohl den Wald vor lauter Bäumen nicht gesehen ;)
Noch dem Fehler hätte ich noch Tage gesucht. Jetzt funktioniert alles prima.
 

DominikDoom

Mitglied
Nochmal eine Frage:
Momentan berechne ich meine Prozente so:
Java:
percent = count * 100 / totalCount;
percent ist eine Double-Variable.
Ist totalCount z.B 3 und count 2, kommt beim Eintippen in den Taschenrechner 66.66666666666667 raus. In meinem Programm ist das Ergebnis allerdings 66.0 :confused:
Für die Progressbars brauche ich es sowieso als int, aber ich würde gerne zusätzlich die genauen Prozente mit Labels anzeigen. Momentan sind alle Prozente zusammen immer nur 98 / 99%, was mir zu ungenau ist. Woran könnte es liegen?
 

JCODA

Top Contributor
momentan sind alle Variablen in deiner Rechnung vom Typ int. Dann ist automatisch das Ergebnis auch int.
Du könntest ein "punkt null" bei der 100 hinzufügen, also so:
Java:
percent = count * 100.0 / totalCount;
Dann wird tatsächlich mit double-Genauigkeit gerechnet.
 
X

Xyz1

Gast
Moin, 33.3, 33.3 und 33.3 gibt, in int gerechnet, auch nur 99%. Wer bekommt das zusätzliche 1%? Das ist ein offenes Problem. Wichtig ist aber:
Java:
count * 100 / absCount; // er rechnet mit int und rundet ab

Java:
count * 100.0 / absCount; // er rechnet die kompletten Berechnungen mit double-Genauigkeit und rundet in keine Richtung
 
X

Xyz1

Gast
Hier bitte so könnte es gerechnet werden (aber bin kein Wahlforscher):
Java:
import java.util.*;

/**
* @author DW on 2016/09/09
*/
public class JavaApplication5 {

    private static class Partei implements Comparable<Partei> {

        String bez;
        int alle;
        int anteil;
        double perGenau;
        int perAbgerundet;
        int perIntGenau;

        @Override
        public int compareTo(Partei o) {
            return Double.compare(o.perGenau, this.perGenau);
        }

        @Override
        public String toString() {
            return "Partei{" + "bez=" + bez + ", alle=" + alle + ", anteil=" + anteil + ", perGenau=" + perGenau + ", perAbgerundet=" + perAbgerundet + ", perIntGenau=" + perIntGenau + '}';
        }
    }

    public static void main(String[] args) {
        Partei[] parteien = new Partei[3];
        parteien[0] = new Partei();
        parteien[0].bez = "spd";
        parteien[1] = new Partei();
        parteien[1].bez = "cdu";
        parteien[2] = new Partei();
        parteien[2].bez = "fdp";
        for (int i = 0; i < 6; i++) {
            int j = (int) (Math.random() * 3.0);
            parteien[j].anteil++;
        }
        for (Partei partei : parteien) {
            partei.alle = 6;
            partei.perGenau = (double) partei.anteil / partei.alle * 100.0;
            partei.perAbgerundet = (int) partei.perGenau;
        }
        for (Partei partei : parteien) {
            System.out.println(partei);
        }
        System.out.println("");
        Arrays.sort(parteien);
        for (Partei partei : parteien) {
            System.out.println(partei);
        }
        System.out.println("");
        for (Partei partei : parteien) {
            partei.perIntGenau = partei.perAbgerundet;
        }
        for (Partei partei : parteien) {
            int sum = 0;
            for (Partei p : parteien) {
                sum += p.perIntGenau;
            }
            if (sum < 100) {
                partei.perIntGenau = partei.perIntGenau + 1;
            } else {
                break;
            }
        }
        for (Partei partei : parteien) {
            System.out.println(partei);
        }
        System.out.println("");
    }
}

Code:
Partei{bez=spd, alle=6, anteil=2, perGenau=33.33333333333333, perAbgerundet=33, perIntGenau=0}
Partei{bez=cdu, alle=6, anteil=3, perGenau=50.0, perAbgerundet=50, perIntGenau=0}
Partei{bez=fdp, alle=6, anteil=1, perGenau=16.666666666666664, perAbgerundet=16, perIntGenau=0}

Partei{bez=cdu, alle=6, anteil=3, perGenau=50.0, perAbgerundet=50, perIntGenau=0}
Partei{bez=spd, alle=6, anteil=2, perGenau=33.33333333333333, perAbgerundet=33, perIntGenau=0}
Partei{bez=fdp, alle=6, anteil=1, perGenau=16.666666666666664, perAbgerundet=16, perIntGenau=0}

Partei{bez=cdu, alle=6, anteil=3, perGenau=50.0, perAbgerundet=50, perIntGenau=51}
Partei{bez=spd, alle=6, anteil=2, perGenau=33.33333333333333, perAbgerundet=33, perIntGenau=33}
Partei{bez=fdp, alle=6, anteil=1, perGenau=16.666666666666664, perAbgerundet=16, perIntGenau=16}

Edit richtig wäre so (nimm nur eine kleine Änderung vor):
Code:
Partei{bez=spd, alle=6, anteil=1, perGenau=16.666666666666664, perAbgerundet=16, perIntGenau=16}
Partei{bez=cdu, alle=6, anteil=3, perGenau=50.0, perAbgerundet=50, perIntGenau=50}
Partei{bez=fdp, alle=6, anteil=2, perGenau=33.33333333333333, perAbgerundet=33, perIntGenau=33}

Partei{bez=spd, alle=6, anteil=1, perGenau=16.666666666666664, perAbgerundet=16, perIntGenau=16}
Partei{bez=fdp, alle=6, anteil=2, perGenau=33.33333333333333, perAbgerundet=33, perIntGenau=33}
Partei{bez=cdu, alle=6, anteil=3, perGenau=50.0, perAbgerundet=50, perIntGenau=50}

Partei{bez=spd, alle=6, anteil=1, perGenau=16.666666666666664, perAbgerundet=16, perIntGenau=17}
Partei{bez=fdp, alle=6, anteil=2, perGenau=33.33333333333333, perAbgerundet=33, perIntGenau=33}
Partei{bez=cdu, alle=6, anteil=3, perGenau=50.0, perAbgerundet=50, perIntGenau=50}

SPD bekommt 1% mehr, da Abschneiden. Alle damit in Ordnung?

(Nehme den Nachkommaanteil in den Fokus)
 
Zuletzt bearbeitet von einem Moderator:
X

Xyz1

Gast
Ich finde es schade, dass keiner seinen Senf dazu gibt. Nochmal neu:
Java:
import java.util.*;

/**
 * @author DW on 2016/09/09
 */
public class JavaApplication5 {

    private static class Partei implements Comparable<Partei> {

        String bez;
        int alle;
        int anteil;
        double perGenau;
        int perAbgerundet;
        int perIntGenau;

        @Override
        public int compareTo(Partei o) {
            return Double.compare(o.perGenau - o.perAbgerundet, this.perGenau - this.perAbgerundet);
        }

        @Override
        public String toString() {
            return "Partei{" + "bez=" + bez + ", alle=" + alle + ", anteil=" + anteil + ", perGenau=" + perGenau + ", perAbgerundet=" + perAbgerundet + ", perIntGenau=" + perIntGenau + '}';
        }
    }

    public static void main(String[] args) {
        // init the Parteien
        Partei[] parteien = new Partei[3];
        parteien[0] = new Partei();
        parteien[0].bez = "spd";
        parteien[1] = new Partei();
        parteien[1].bez = "cdu";
        parteien[2] = new Partei();
        parteien[2].bez = "fdp";

        // do the vote
        for (int i = 0; i < 6; i++) {
            int j = (int) (Math.random() * 3.0);
            parteien[j].anteil++;
        }
        for (Partei partei : parteien) {
            partei.alle = 6;
            partei.perGenau = partei.anteil * 100.0 / partei.alle;
            partei.perAbgerundet = (int) partei.perGenau;
            partei.perIntGenau = partei.perAbgerundet;

        }

        // print the vote
        for (Partei partei : parteien) {
            System.out.println(partei);
        }
        System.out.println("");

        // sort the vote
        Arrays.sort(parteien);

        // print the sorted vote
        for (Partei partei : parteien) {
            System.out.println(partei);
        }
        System.out.println("");

        // calc the exactly percents
        for (Partei partei : parteien) {
            int sum = 0;
            for (Partei p : parteien) {
                sum += p.perIntGenau;
            }
            if (sum < 100) {
                partei.perIntGenau = partei.perIntGenau + 1;
            } else {
                break;
            }
        }

        // print finally the votes
        for (Partei partei : parteien) {
            System.out.println(partei);
        }
        System.out.println("");
    }
}

Code:
Partei{bez=spd, alle=6, anteil=1, perGenau=16.666666666666668, perAbgerundet=16, perIntGenau=16}
Partei{bez=cdu, alle=6, anteil=3, perGenau=50.0, perAbgerundet=50, perIntGenau=50}
Partei{bez=fdp, alle=6, anteil=2, perGenau=33.333333333333336, perAbgerundet=33, perIntGenau=33}

Partei{bez=spd, alle=6, anteil=1, perGenau=16.666666666666668, perAbgerundet=16, perIntGenau=16}
Partei{bez=fdp, alle=6, anteil=2, perGenau=33.333333333333336, perAbgerundet=33, perIntGenau=33}
Partei{bez=cdu, alle=6, anteil=3, perGenau=50.0, perAbgerundet=50, perIntGenau=50}

Partei{bez=spd, alle=6, anteil=1, perGenau=16.666666666666668, perAbgerundet=16, perIntGenau=17}
Partei{bez=fdp, alle=6, anteil=2, perGenau=33.333333333333336, perAbgerundet=33, perIntGenau=33}
Partei{bez=cdu, alle=6, anteil=3, perGenau=50.0, perAbgerundet=50, perIntGenau=50}

Also vereinfacht gesagt, die Lösung des problems ist, solange immer aufzurunden, bis die Summe == 100 ist.

Ich verstehe nicht, was daran schwer zu verstehen. Natürlich müsste alles in extra Methoden, und nicht alles in die #main().

Ich hoffe, es konnte etwas behilflich sein. Über ein schnelles "Feedback" würd ich mich freuen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
I Zapier -> wie werden Objekte gespeichert? Java Basics - Anfänger-Themen 10
L Datum - Monat und Jahr werden falsch angezeigt Java Basics - Anfänger-Themen 4
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
K Warum werden immer noch doppelte Zahlen ausgegeben ? Java Basics - Anfänger-Themen 13
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
I aus 2 random zahlen soll nur die ungerade summe der beiden genommen werden. Java Basics - Anfänger-Themen 13
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
R Audio kann nur zum Teil gestoppt werden Java Basics - Anfänger-Themen 1
berserkerdq2 sqllite in Java, wenn ich mache select count(*) ..., erhalte ich dann nur die gezählte Anzahl oder werden auch die Tabellen ausgegeben? Java Basics - Anfänger-Themen 2
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
docmas 2DArray Werte werden nur untereinander ausgegeben Java Basics - Anfänger-Themen 1
E Umlaute und Sonderzeichen werden nach der Build Project nicht richtig angezeigt Java Basics - Anfänger-Themen 2
M Bei nach oben scrollen soll Seite aktualisiert werden (Userscript mit Javascript) Java Basics - Anfänger-Themen 10
A Wenn eine Zahl durch 7 teilbar ist, soll statt der Zahl ein ‘*‘ angezeigt werden. java? Java Basics - Anfänger-Themen 47
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
Q Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann. Java Basics - Anfänger-Themen 20
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
LiFunk Exception: es dürfen nur Nummern eingelesen werden Java Basics - Anfänger-Themen 6
U Hauptklasse kann nicht gefunden werden Java Basics - Anfänger-Themen 8
OZAN86 For Schleife von 1-50 die Zahlen werden durch ein Komma getrennt Java Basics - Anfänger-Themen 10
M Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden? Java Basics - Anfänger-Themen 7
Hallolu Pong-Spiel: Schläger schneller werden lassen Java Basics - Anfänger-Themen 9
C java.sql Statement kann nicht geschlossen werden Java Basics - Anfänger-Themen 9
LetsSebi Dateien werden nicht in Zip gespeichert Java Basics - Anfänger-Themen 1
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
J Array Elemente werden nicht gefunden! Java Basics - Anfänger-Themen 6
M Warum werden character, die Leerzeichen sind, nicht korrekt verarbeitet? Java Basics - Anfänger-Themen 2
C Array-Werte werden gemischt, ohne Logik Java Basics - Anfänger-Themen 2
P Variablen HttpResponse.getBody() wird automatisch org.json Object und kann nicht zu json.simple Object gecastet werden? Java Basics - Anfänger-Themen 7
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
Zrebna Programm kann aus der Konsole nicht gestartet werden (in der IDE läuft es) Java Basics - Anfänger-Themen 2
D Zahlen werden falsch gekürzt :? Java Basics - Anfänger-Themen 27
T Javafx ListView kann nicht gefüllt werden. Java Basics - Anfänger-Themen 6
H Eclipse kann nicht gestartet werden .... Java Basics - Anfänger-Themen 15
R Warum werden hier nur die grün und orangen Linien ausgegeben und der Rest unten nicht? Java Basics - Anfänger-Themen 5
J Eckige Klammern werden nicht erkannt Java Basics - Anfänger-Themen 1
J Klammern werden fälschlicherweise eingelesen Java Basics - Anfänger-Themen 2
Elyt Bei Monopoly werden Felder übersprungen Java Basics - Anfänger-Themen 2
Kirby.exe Hauptklasse konnte nicht gefunden werden.... Java Basics - Anfänger-Themen 27
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
L Muss eine HttpURLConnection geschlossen werden? Java Basics - Anfänger-Themen 2
B Warum werden meine System.out.println's übersprungen? Java Basics - Anfänger-Themen 9
D java main methode kann nicht kompiliert werden (Erstellen eines Objekts) Java Basics - Anfänger-Themen 6
S Vergleichen ob der Integer der benutzt eingeben werden soll überhaupt ein int ist Java Basics - Anfänger-Themen 1
B Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden? Java Basics - Anfänger-Themen 7
V Array, Symbol kann nicht gefunden werden Java Basics - Anfänger-Themen 2
S TableView Items werden nicht angezeigt (+Verständnisfragen) Java Basics - Anfänger-Themen 15
O Apache: Log-Settings werden nicht gezogen Java Basics - Anfänger-Themen 0
H LayoutRes, Nullable und SystemServices werden in LayoutInflater nicht importiert Java Basics - Anfänger-Themen 9
A Wie erkennt die JVM welche class verwendet werden muss? Java Basics - Anfänger-Themen 3
L Input/Output AudioInputStream kann nicht erstellt werden. Java Basics - Anfänger-Themen 3
E Die Hauptklasse konnte nicht gefunden werden. Java Basics - Anfänger-Themen 12
H Hauptklasse ... konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 8
I Projekt als .jar Datei speichern - Bilder werden nicht mehr angezeigt Java Basics - Anfänger-Themen 4
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
A Reader wohin werden Daten gespeichert? Java Basics - Anfänger-Themen 7
S Hauptklasse konnte nicht gefunden werden Java Basics - Anfänger-Themen 0
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
C Matrix-Werte werden nicht wie erwartet ausgegeben Java Basics - Anfänger-Themen 7
A Harshad Zahlen sollen in einem Intervall ausgegeben werden Java Basics - Anfänger-Themen 8
M GUI Startbutton und Titel werden nicht angezeigt Java Basics - Anfänger-Themen 1
F Variablen JTextField-Inhalt kann nicht mit String abgeglichen werden Java Basics - Anfänger-Themen 2
F Interface JButtons werden nicht angezeigt... Java Basics - Anfänger-Themen 5
DaCrazyJavaExpert Bilder werden nicht angezeigt! Java Basics - Anfänger-Themen 6
DaCrazyJavaExpert JLabels werden nicht angezeigt Java Basics - Anfänger-Themen 4
G Verkettete Liste - Neu erzeugte Elemente werden nicht ausgegeben Java Basics - Anfänger-Themen 5
S Fehler: Hauptklasse bin.demo.Start konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 2
M Klassen Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 17
P Interface Variablen-Inhalte werden nicht übergeben Java Basics - Anfänger-Themen 3
S Classpath "Hauptklasse konnte nicht gefunden oder geladen werden" Java Basics - Anfänger-Themen 6
T In Konsole darf nichts falsches eingetippt werden?! Java Basics - Anfänger-Themen 7
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
C AppletViewer-Eigenschaftendatei kann nicht gelesen werden Java Basics - Anfänger-Themen 0
D Erste Schritte JFrame Inhalte werden nicht angezeigt Java Basics - Anfänger-Themen 8
L Bei falscher Eingabe soll NaN zurückgegeben werden, Rückgabetyp jedoch double Java Basics - Anfänger-Themen 3
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
H überprüfen ob in Array gleiche int-Zahlen gespeichert werden. Java Basics - Anfänger-Themen 7
P Threads Prozess kann nicht über die GUI gestartet werden Java Basics - Anfänger-Themen 8
H javac.exe konnte nicht gefunden werden Java Basics - Anfänger-Themen 2
H Methoden können nicht verwendet werden Java Basics - Anfänger-Themen 10
P Programm kann über CMD nicht ausgeführt werden Java Basics - Anfänger-Themen 2
C Java Hauptklasse konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 14
J Kann der Typ eines Objekts ausgegeben werden? Java Basics - Anfänger-Themen 11
K Hauptklasse konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 3
N String kann nicht in Wochentag konvertiert werden Java Basics - Anfänger-Themen 6
C Klassen Sudoku-Spiel Werte werden nicht gesetzt Java Basics - Anfänger-Themen 4
B PATH kann nicht geändert werden Java Basics - Anfänger-Themen 2
J JDK installieren Hauptklasse .... konnte nicht geladen werden. Java Basics - Anfänger-Themen 4
K Klassen Hilfe - Hauptklasse kann nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 5
D Classpath Bild kann in .jar nicht geladen werden Java Basics - Anfänger-Themen 2
E Shell: Hauptklasse konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben