Double oder Decimal,Probleme mit Rechnung "," "."

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von haufe.

    Double oder Decimal,Probleme mit Rechnung "," "."

    Hallo,

    ich habe immer einen Rechenfehler bei meinem Code und leider finde ich den Fehler nicht, über Hilfe würde ich mich freuen.
    Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Globalization
    3. Imports System.Threading
    4. Public Class Form1
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. End Sub
    7. Structure cords
    8. Dim s As Double
    9. Dim z As Double
    10. Dim e As Double
    11. End Structure
    12. Sub createarea(ByVal point1 As cords, ByVal point2 As cords)
    13. 'Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
    14. MsgBox(point1.s.ToString)
    15. If point1.s > point2.s Then
    16. Else
    17. Dim sdif As Double
    18. sdif = point2.s - point1.s
    19. TextBox1.Text = sdif.ToString
    20. End If
    21. End Sub
    22. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    23. Dim c1 As New cords
    24. c1.s = Double.Parse("1931.4")
    25. c1.e = Double.Parse("-325.4")
    26. c1.z = Double.Parse("37.6")
    27. Dim c2 As New cords
    28. c2.s = Double.Parse("1934.4")
    29. c2.e = Double.Parse("-284.8")
    30. c2.z = Double.Parse("21.7")
    31. createarea(c1, c2)
    32. End Sub
    33. End Class
    ähh? wasn das :)
    Auf einem deutschen System ist das Dezimaltrennzeichen das Komma und der Punkt das Tausendertrennzeichen. 1931.4 wird dementsprechend einfach als 19314 ausgewertet.
    Wenn du das englische bzw. invariante Format haben möchtest, musst du dieses beim Parsen mit angeben (siehe Double.Parse-Überladungen).

    haufe schrieb:

    Rechenfehler
    Es gibt zwei Möglichkeiten, nein, es gibt drei Möglichkeiten:
    1. Du lässt das das System machen, da musst Du allerdings in einer TextBox aufpassen, dass das richtige Dezimal-Trennzeichen verwendet wird, also das Komma (DE) bzw. Punkt (EN) auf dem Ziffernblock, das bringt den KeyCode Keys.Decimal.
    2. Du konvertierst alle Strings dahingehend, dass sie denselben Separator (".") haben und dann konvertierst Du die Werte entsprechend dem Code von @Artentus, nachdem Du dies getestet hast:

      VB.NET-Quellcode

      1. Dim d1 = Double.Parse("1931.4", CultureInfo.InvariantCulture)
      2. Dim d2 = Double.Parse("1931,4", CultureInfo.InvariantCulture)
      3. MessageBox.Show(d1 & Environment.NewLine & d2)

    3. Du verwendest ein NumericUpDown, da musst Du Dich um derartige Konvertierungen nicht kümmern.
    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!