VB Rundungsproblem

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    VB Rundungsproblem

    Moin moin

    Ich habe ein Problem mit dem richtigen Runden von Zahlen.
    Mein Code:

    VB.NET-Quellcode

    1. Public Class Resistor
    2. Friend KWert As Double
    3. Friend Wertereihen As Integer
    4. Friend Sub Berechne_EReihe(Anzahl As Integer)
    5. KWert = 1
    6. Dim Dekade As Integer = 10
    7. For x = 0 To Anzahl - 1
    8. LstBox_ereihe.Items.Add(KWert.ToString("0.###"))
    9. KWert = KWert * (Dekade ^ (1 / Anzahl))
    10. KWert = KWert
    11. Next
    12. End Sub


    Ausgabe bei drei Anzahl = 3 ergibt: 1 // 2,154 // 4,642 müßte aber ergeben => 1 // 2,2 // 4,7
    Mit ​ KWert = (Math.Ceiling(KWert)) oder KWert = (Math.Round(KWert)) komme ich nicht ans Ziel.
    Und je mehr durchläufe es macht wirds immer seltsamer...
    Bilder
    • runden-1.jpg

      85,47 kB, 580×207, 71 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    KWert = (Math.Round(KWert)) ergibt bei Anzahl 3 ===> 1 // 2 // 4

    KWert = (Math.Ceiling(KWert)) ergibt bei Anzahl 3 ===> 1 // 3 // 7

    müßte nach dem Runden aber ergeben => 1 // 2,2 // 4,7
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Was soll denn eigentlich berechnet werden? Die Klasse heißt Resistor, klingt nach Physik, gibts da eventuell eine Formel zu dem Vorgang?

    Mit Math.Round kann man auch Nachkommastellen einstellen, Math.Round(KWert,3) hat 3 Nachkommastellen. Default ist 0, also ohne Nachkommastellenangabe.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Einfach testen:

    VB.NET-Quellcode

    1. Dim Darr(0 To 4) As Double
    2. Darr(0) = 1.46779926
    3. Darr(1) = 2.15443469
    4. Darr(2) = 3.16227766
    5. Darr(3) = 4.64158883
    6. Darr(4) = 6.81292069
    7. For i As Integer = 0 To 4
    8. Debug.Print(Darr(i).ToString & " --> " & Darr(i).ToString("F1"))
    9. Next


    Ergebnis:
    1,46779926 --> 1,5
    2,15443469 --> 2,2
    3,16227766 --> 3,2
    4,64158883 --> 4,6
    6,81292069 --> 6,8
    Wo kommt denn die 3,3 her, das kann doch nur 3,2 sein!
    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!
    @Haudruferzappeltnoch
    Ja ist Physik. Es sollen die E-Reihen von Widerständen berechnet werden. Das ausrechnen klappt ja nur eben das genaue Runden nicht.

    @ErfinderDesRades
    ? Was war nix? ;)

    @Eierlein
    Ich denke wenn da schon bei 3,223,16227766 --> 3,2 rauskommt wir es bei 48 oder gar 192 durchläufen auch nicht besser????

    Im Bild ist die Reihe E-12 Spalte 1 ===> bei meinem Prog ist Anzahl=12
    Bilder
    • runden-3.jpg

      337,72 kB, 636×548, 72 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Aus Wikipedia:

    Da die Reihen E3, E6, E12 und E24 schon 1948 und 1950 und damit vor der Entstehung der Norm DIN IEC 63 festgelegt wurden, entsprechen in den E3- bis E24-Reihen die Werte von 2,7 bis 4,7 und 8,2 nicht den Rundungsregeln, was aber auf Grund der großen Verbreitung nicht mehr geändert worden ist.
    OK Danke erstmal

    Aber warum Rundet KWert = (Math.Round(KWert, 1)) === > 1,778279410038923 zu 1,7
    Sollte da nicht 1,8 draus werden?

    EDIT: Sehe gerade das sich eben das Beispiel ändert je nachdem ob ich E-12 oder E-24 durchlaufen lasse...
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Werte aus der DIN haben (juristisch) gesetzlichen Charakter, die muss man nicht ausrechnen, die muss man nur noch abschreiben, es sei denn, es steht eine Formel in der DIN.
    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!

    RodFromGermany schrieb:

    Werte aus der DIN haben (juristisch) gesetzlichen Charakter, die muss man nicht ausrechnen


    Naja für mich war es dann eine schöne Übung bzgl Klassen und Rechnen mit VB ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    eine schöne Übung
    wäre das Implementieren verschiedener Regeln beim Runden.
    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!
    Ja das werde ich machen.

    Habe nun noch etwas in Erfahrung gebracht.
    ​ Die Berechnung des Faktors k ergibt bei E3 2,1544.. . Die nachfolgenden Stellen spielen für die weitere Berechnung keine Rolle. Für die Widerstandsreihen E6, E12, E24, etc. gibt es jeweils andere Werte für den Faktor k.
    Widerstandsreihe Faktor k
    E3 2,1544..
    E6 1,4677..
    E12 1,2115..
    E24 1,1006..
    E48 1,0491..
    E96 1,0242..

    Wenn ich dann mit diesen Werten spiele komme ich den Reihen mit der Rundung sehr nahe.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    So habe meinen Code fertig. Bis auf die IF Abfragen bei den RadioButtons bin ich ganz zufrieden damit.
    Die ermittelten Werte kommen nun, bis auf einige wenige Ausnahmen an die E-Reihen herran.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Frm_main
    2. Private ReadOnly Kwert_EReihe() As Double = {2.1544, 1.4677, 1.2115, 1.1006, 1.0491, 1.0242, 1.0121}
    3. Private ReadOnly Anzahl_EReihe() As Integer = {3, 6, 12, 24, 48, 96, 192}
    4. Private RButton As List(Of RadioButton) = Nothing
    5. Private Sub LadeRButtons()
    6. RButton = New List(Of RadioButton) From {rb_E3, rb_E6, rb_E12, rb_E24, rb_E48, rb_E96, rb_E192}
    7. End Sub
    8. Private Sub Frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. LadeRButtons()
    10. End Sub
    11. Private Sub Berechne_EReihe(Anzahl As Integer, KWert As Double)
    12. LstBox_ereihe.Items.Clear()
    13. lbl_kwert.Text = "K-Wert ist: " & KWert.ToString
    14. LstBox_ereihe.Items.Add("1")
    15. Dim Dekade As Integer = 10
    16. Dim Nachkomma As Integer
    17. Dim NKWert As Double
    18. If Anzahl < 48 Then Nachkomma = 1 Else Nachkomma = 3
    19. For x = 1 To Anzahl - 1
    20. NKWert = (Math.Round(KWert, Nachkomma))
    21. LstBox_ereihe.Items.Add(NKWert.ToString("0.##"))
    22. KWert = KWert * (Dekade ^ (1 / Anzahl))
    23. Next
    24. End Sub
    25. Private Sub Rbs_CheckedChanged(sender As Object, e As EventArgs) Handles rb_E3.CheckedChanged, rb_E6.CheckedChanged, rb_E12.CheckedChanged, rb_E24.CheckedChanged, rb_E48.CheckedChanged, rb_E96.CheckedChanged, rb_E192.CheckedChanged
    26. Dim zahl, x,y As Integer
    27. Dim wert As Double
    28. If RButton(0).Checked Then
    29. x = 0
    30. y = 0
    31. ElseIf RButton(1).Checked Then
    32. x = 1
    33. y = 1
    34. ElseIf RButton(2).Checked Then
    35. x = 2
    36. y = 2
    37. ElseIf RButton(3).Checked Then
    38. x = 3
    39. y = 3
    40. ElseIf RButton(4).Checked Then
    41. x = 4
    42. y = 4
    43. ElseIf RButton(5).Checked Then
    44. x = 5
    45. y = 5
    46. ElseIf RButton(6).Checked Then
    47. x = 6
    48. y = 6
    49. End If
    50. wert = Kwert_EReihe(x)
    51. zahl = Anzahl_EReihe(y)
    52. Berechne_EReihe(zahl, wert)
    53. End Sub
    54. End Class



    @ErfinderDesRades
    Na da hatte sich ja was reingeschmugelt ;)
    Bilder
    • WiderstandEReihe-1.jpg

      98,73 kB, 340×422, 65 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    So was:

    VB.NET-Quellcode

    1. Private Sub Rbs_CheckedChanged(sender As Object, e As EventArgs) Handles rb_E3.CheckedChanged, rb_E6.CheckedChanged, rb_E12.CheckedChanged, rb_E24.CheckedChanged, rb_E48.CheckedChanged, rb_E96.CheckedChanged, rb_E192.CheckedChanged
    2. For i = 0 To RButton.Count - 1
    3. If RButton(i).Checked Then
    4. Berechne_EReihe(Anzahl_EReihe(i), Kwert_EReihe(i))
    5. Return
    6. End If
    7. Next
    8. End Sub
    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!