Differenz in Prozent ausrechnen

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von menorca.

    Hallo und Danke für eure Antworten.

    habe aber irgendwie das Gefühl das es doch noch nicht so wirklich nachvollziehbar ist für dritte

    um an die Werte zu kommen verwende ich diesen Code, und dann rechne ich es aus.
    das Ergebnis auf der Form im Anhang, kann das stimmen? oder wie würdet ihr das machen

    ich möchte ja wissen ob die Instandhaltung und Fertigung annährend gleiche Störmeldungen schreibt oder wie Abweichend die Instandhaltung zur Fertigung ist
    oder eben umgekehrt Fertigung zur Instandhaltung.

    muss da nicht etwas wie Meldung Instandhaltung 128,23% also 28,23% mehr gemeldet als die Fertigung bzw. abweichend zur Fertigung.
    wer hat eine gute Lösung, bzw. Idee

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub _differenz_berechnen()
    2. Dim Wert1 As Double = 0
    3. Dim Wert2 As Double = 0
    4. Dim Ergebnis As Double
    5. Dim Ergo As Double
    6. Dim diff1 As Double = 0
    7. Dim diff2 As Double = 0
    8. For Each item As ListViewItem In StoerEintraege.Items
    9. Wert1 = Wert1 + CDbl(item.SubItems(4).Text)
    10. Next
    11. '//
    12. For Each item As ListViewItem In LVSchichtbuch.Items
    13. Wert2 = Wert2 + CDbl(item.SubItems(4).Text)
    14. Next
    15. 'deine differenz ist ((678-568)/678)*100=16,22%
    16. Ergebnis = ((Wert1 - Wert2) / Wert1 * 100)
    17. Ergo = ((Wert2 - Wert1) / Wert2 * 100)
    18. diff1 = Wert1 - Wert2
    19. diff2 = Wert2 - Wert1
    20. lbldifferenz2.Text = String.Format("Abweichung zum AF " & diff2 & " Minuten " & "{0:0.00} %", Ergo) + vbNewLine
    21. lbldifferenz.Text = String.Format("Abweichung zur IH " & diff1 & " Minuten " & "{0:0.00} %", Ergebnis)
    22. End Sub
    Bilder
    • Differenzen Berechnen.png

      75,32 kB, 1.089×883, 3.806 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „menorca“ ()

    also erstmal nimm nicht CDbl() sondern Double.Parse().
    was du mit ergo und diff1 etc willst ist mir schleierhaft. wenn du einen prozentualen wert ausgeben wilst braucht der immer genau eine definierte basis und das ist der größte wert.
    also ist deine differenz die folgende:

    VB.NET-Quellcode

    1. Dim Differenz As Double
    2. Dim Wert1 As Double
    3. Dim Wert2 As Double
    4. Differenz=((Math.Max(Wert1, Wert2)-Math.Min(Wert1, Wert2))/Math.Max(Wert1, Wert2))*100


    also angenommen Wert1 ist die anzahl der fertigung und Wert2 ist die anzahl der instandhaltung.
    dann ist das verhältnis fertigung/instandhaltung=((Wert1-Wert2)/Wert1)*100
    und das verhältnis instandhaltung/fertigung=((Wert2-Wert1)/wert2)*100

    da negative prozentsätze irreführend sind musst du mit den absolutbeträgen der differenzen rechnen und deshalb immer (groß-klein)/groß*100

    grundsätzlich solltest du aber eine einzige basis wählen ENTWEDER fertigung ODER instandhaltung.
    der rest ist irreführend, zumal die absolutwerte der jeweiligen einträge auch angezeigt werden.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „affrop“ ()

    @menorca:: Ich halte die Herangehensweise für merkwürdig.
    Rnd 10,123456789876543231 Stunden, da kann man doch gleich 10:47 Stunden schreiben.
    Und eine Prozent-Angabe nur da, wo es sinnvoll ist:
    Unser Plan: Wir wollen die Waldbrände in Florida um 25 Prozent senken.
    ist einfach schwachsinnig.
    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!
    Hallo Affrop,

    Danke ich habe das mal so umgestzt, und mich auf eine Basis (Fertigung) geeinigt

    @Rod was gefällt dir an meine Rundung nicht?

    VB.NET-Quellcode

    1. Dim Ergebnis As Double = 0
    2. For Each item As ListViewItem In LVSchichtbuch.Items
    3. Ergebnis = Ergebnis + Double.Parse(item.SubItems(4).Text)
    4. Next
    5. TextBox1.Text = "Ausfallzeit " & Ergebnis.ToString & " Minuten oder Rnd " & ((Double.Parse(Math.Round(Ergebnis / 60, 2)).ToString & " Stunden "))
    doch das habe ich so gemacht

    VB.NET-Quellcode

    1. '--- Variabeln setzen
    2. Dim Differenz As Double
    3. Dim Wert1 As Double
    4. Dim Wert2 As Double
    5. '------- Wert1 Instandhaltung
    6. For Each item As ListViewItem In StoerEintraege.Items
    7. Wert1 = Wert1 + Double.Parse(item.SubItems(4).Text)
    8. Next
    9. '------- Wert2 Fertigung
    10. For Each item As ListViewItem In LVSchichtbuch.Items
    11. Wert2 = Wert2 + Double.Parse(item.SubItems(4).Text)
    12. Next
    13. '------ Differenz Berechnung
    14. Differenz = ((Math.Max(Wert1, Wert2) - Math.Min(Wert1, Wert2)) / Math.Max(Wert1, Wert2)) * 100
    15. '------- Anzeigen in Label auf der Form
    16. lbldifferenz.Text = String.Format("Abweichung zur IH " & "{0:0.00} %", Differenz)

    menorca schrieb:

    was gefällt dir an meine Rundung nicht?
    Die Rundung selbst.
    Der Mensch ist eine Analog- und eine Digital-Uhr gewöhnt, die ist seit den Babyloniern hexagesimal geteilt.
    Eine dezimale Minuten-Angabe ist völlig ungewöhnlich.
    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!
    Vollzitat eines Vorposts an dieser Stelle entfernt ~VaporiZed

    habe es so probiert, doch das passt nicht

    VB.NET-Quellcode

    1. txtAusfallzeit.Text = String.Format("Die Ausfallzeit in " & "{0:HH} Stunden und {0:mm}", (Ergebnis / 60))

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    menorca schrieb:

    doch das passt nicht
    Warum zitierst Du denn den Post 3 Mal?

    VB.NET-Quellcode

    1. Dim min = 821
    2. Dim h = min \ 60
    3. min -= h * 60
    4. MessageBox.Show(String.Format("{0}:{1}", h, min))
    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!
    Guten Morgen zusammen,

    eure Hilfe war hilfreich dfür noch mals schönen Dank.

    da der nächste Schritt mit diesem Zusammenhängt, möchte ich hier nachtragen.

    das Ergebnis möchte ich Grafisch darstellen in einem Balken Diagramm

    Minuten Instandhaltung
    Minuten Fertigung
    Abweichung Prozent

    wie gehe ich da vor?

    menorca schrieb:

    in einem Balken Diagramm
    Pack die Daten in eine DataTable (Double, Double) oder (Integer, Integer).
    Mach ein ChartControl mit einer Series und häng dann die DataTable per DataBindng an das Chart:

    VB.NET-Quellcode

    1. Chart1.DataSource = Me.table
    2. Chart1.Series(0).XValueMember = Me.table.Columns(0).ToString
    3. Chart1.Series(0).YValueMembers = Me.table.Columns(1).ToString
    4. Chart1.DataBind()
    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!