Prozent für eigene Progressbar ausrechnen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Breadsoft.

    Prozent für eigene Progressbar ausrechnen

    Guten Tag

    Die Frage ist jetzt wahrscheinlich total blöd aber kann mir jemand folgende Rechnung erklären

    VB.NET-Quellcode

    1. Dim percent As Integer = (currval - minval) / (maxval - minval)

    Wahrscheinlich hab ich das in der Schule schon gelernt aber ich weiß nicht mehr richtig was es genau war.

    Vielen Dank im Voraus


    MfG
    Breadsoft

    Das ist der sogenannte Dreisatz.
    Wenn currval von minval bis maxval läuft, läuft das Ergebnis von 0 bis 1.
    Wenn Du Prozente haben willst, musst Du das Ergebnis mit 100 multiplizieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    bei der Prozentrechnung hast du einen Referenzwert (steht im Nenner) und einen Wert, dessen Prozentwert bezüglich des Referenzwertes du berechnen möchtest. Der (dargestellte) Wertebereich in deinem Fall wäre eben Minimum bis Maximum. Wenn Minimum der minimale, dargestellte Wert ist, entspricht das bei einer Progressbar der 0 und Maximum der Breite der Progressbar. Value liegt halt irgendwo zwischen Minimum und Maximum und er erfüllt die gleichen Kriterien, also.
    Der Fehler bei deiner Rechnung liegt übrigens bei der Genauigkeit von Ganzzahlen, d.h. bei dir kommt entweder 0 oder 1 raus, aber keine Werte dazwischen. Abhilfe gibt folgende Rechnung:

    VB.NET-Quellcode

    1. Dim width As Integer = CInt(Math.BigMul(ClientSize.Width, currval - minval) \ (maxval - minval))

    Es wird hierbei auch ausgeschlossen, dass es zu einem Überlauf kommt.

    Ja, du hast es falsch verstanden. Prozentrechnen heißt, man "normiert" einen Wert auf einen bestimmten Referenzwert. Prozent heißt eben, dass man es relativ zu 100% normiert. 300% heißt, dass der Wert 300 drinsteht, wenn Minimum 0 und Maximum 100 ist.

    Gruß
    ~blaze~

    Breadsoft schrieb:

    und nur mal angenommen
    minval = 17
    maxval = 33
    currval = 17 ==> (currval - minval) / (maxval - minval) = 0
    currval = 33 ==> (currval - minval) / (maxval - minval) = 1
    Das musst Du natürlich in Double ausrechnen.
    Mit 100 multipliziert kommt oben wieder 0, unten 100 raus. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oder, wie ich's gemacht hab: Integer-Division mit dem Faktor ClientSize.Width. Bei (v-min)/(max-min)
    kommt halt 0 oder 1 raus. Wenn man ClientSize.Width * (v-min)/(max-min) schreibt, kommt eben ein Wert zwischen 0 und ClientSize.Width raus, wobei alle ganzzahligen Werte zwischen 0 und ClientSize.Width herauskommen können. Über Math.BigMul wird dafür gesorgt, dass der Wert Integer.MaxValue nicht überschreitet.
    Wenn du keine ganzzahligen Schritte hast, kannst du das auch per Single berechnen. dazu einfach ClientSize.Width * (CSng(v-min)/(max-min)) berechnen. Double ist in dem Fall zu groß gewählt, da GDI maximal Single unterstützt.

    Gruß
    ~blaze~