Prozentzahl
-
suchen: Stichwort: 'ProcessMessages'
-
Bj schrieb:
denke mal die rechnung ist korreckt.
Sicher? Mir war da noch was bezüglich Punkt vor Strich regeln und so...
Ahja:
http://c-plusplus.net/forum/viewtopic.php?t=9815-junix
-
punkt vor strich?
da gibt es nur divison und multiplikation.
ich sehe nicht wo dann in dieser rechnung da problem sein solldanke für den link
-
WARUM KLAPPT DAS DENN NOCH NICHT?
int prozent = (azaehler/anzahl_eintraege)*100; // azaehler: 1......max // anzahl_einträge: max Application->ProcessMessages(); Form1 -> lb_prozent -> Caption = String(prozent);
was ist denn daran falsch?
es läuft auch, aber er zeigt die ganzen 20 sekunden die die schleife durchläuft immer 0 an, und zum schluss 100.da ist doch kein fehler drin!???!?!??!
Bj
-
Oh, Man!
int prozent = (azaehler/anzahl_eintraege)*100; // azaehler: 1......max // anzahl_einträge: max Form1->lb_prozent->Caption = String(prozent); Application->ProcessMessages();
-
so geht es leider auch nicht!
du hast ja
Application->ProcessMessages();
nur dahinter geschrieben!aber so zeigt er während der lauzeit auch nur 0 an, und wenn die schleide durchlaufen ist, 100.
was stimmt denn da noch nicht?
thx
Bj
-
zeige doch mal dein code
-
Vermutlich ergibt diese Teilrechnung: (azaehler/anzahl_eintraege) eine Zahl < 1. (logisch) da du aber nur mit Integerzahlen rechnest und diese keine Kommastellen haben, werden diese abgeschnitten und durch 0.x wird 0. 0 x 100 = 0. Soviel zur Mathematik.
Was du nun tun kannst ist, den einen faktor (azaehler) VOR dem Teilen mit 100 zu multiplizieren und anschliessend erst durch anzahl_eintraege zu dividieren... dann dürfte das Ergebnis wohl den gewünschten effekt zeigen.
-junix
-
int prozent = ((azaehler/anzahl_eintraege)*100); Form1 -> lb_prozent -> Caption = String(prozent); Application->ProcessMessages();
Wobei ich zur laufzeit auch die variablen überprüft habe, welche aber stimmen.
azaehler: zählt immer weiter hoch.
anzahl_einträge: dort steht immer 3376 drin.dort müsste doch alles stimmen?
trotzdem errechnet er immer 0.thx
Bj
-
zusammen mit der schleife
-
@ junix.
so funktioniert es.
aber habe es übrigens auch schon mit float versucht, kommt aber aufs selbe raus. warum denn das? dort ist dein oben beschriebenes problem ja nicht.
aber ist es nicht sp??:
er rechnet die divison, die unter 0 ist, dann multipliziert mit 100, und was dort herauskommt schneidet er erst hinter dem komma ab?!?also warum funktioniert das alles nicht mit float?
-
aber habe es übrigens auch schon mit float versucht, [...] dort ist dein oben beschriebenes problem ja nicht.
Irrtum. Der Cast nach Float passiert erst im Moment der Zuweisung zu einem Float. Solange du keine Floatzahlen in der Rechnung hast, ist ihm das ziemlich wurscht.
-junix
-
aber was ich nicht verstehe ist:
so funktioniert es:
float prozent = (azaehler*100)/anzahl_eintraege;aber so nicht:
*float prozent = (azaehler/anzahl_eintraege)100;obwohl das doch praktisch gesehen die selbe rechnung ist!!!???
-
ist es aber nicht. Jetzt kannst du mal selber so nachrechnen wies der Compiler macht, gemäss den mathematischen Regeln. Bei obiger Variante bekommst du nie eine Zahl < 1. Bei der unteren Variante ergibt der erste Term eine Zahl 0.X.
Das Problem ist nun, dass der Compiler erst dann implizit castet, wenn er den ersten Kontakt mit einem anderen Typ (z.B. float) hat. In beiden Fällen passiert das in der Zuweisung.
Um dem Vorzubeugen, hast du zwei möglichkeiten: Entweder du castest jeden Wert explizit nach float, oder du sorgst dafür, dass es nie ergebnisse < 1 ergibt.
-junix
-
ok, vielen dank für die erklärungen!
Bj