Die arithmetische Operation hat einen Überlauf verursacht.

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Die arithmetische Operation hat einen Überlauf verursacht.

    Hallo,
    ich bin gerade dabei von einer anderen Programmiersprache umzusteigen *hust* Autoit *hust* :D
    um ein bischen zu üben wollte ich mal nen kleinen taschenrechner Programmieren :D klappt auch soweit... (wenn das ergebnis zu groß ist stürzt das programm ab ;) is ja logisch) das programm stürzt ab einem ergebnis von "+/- 2,147,483,647" ab ... das stört mich jetzt nicht sonderlich, aber wenn ich prüfen will, ob in der textbox1 eine zu große zahl steht kommt nur:
    " OverflowException wurde nicht behandelt. Die arithmetische Operation hat einen Überlauf verursacht. ". Klar die zehl ist zu groß, aber kann ich irgentwie eine größere zahl verwenden?
    Hier mal der relevante code:"

    VB.NET-Quellcode

    1. If (Addieren.Checked = True) Then
    2. If (CInt(TextBox1.Text) > 1073741823) Then
    3. MsgBox("Addition ist nur mit Zahlen im Bereich zwischen -/+ 1073741823 möglich!")
    4. ElseIf (CInt(TextBox1.Text) < -1073741823) Then
    5. MsgBox("Addition ist nur mit Zahlen im Bereich zwischen -/+ 1073741823 möglich!")
    6. ElseIf (CInt(TextBox2.Text) < -1073741823) Then
    7. MsgBox("Addition ist nur mit Zahlen im Bereich zwischen -/+ 1073741823 möglich!")
    8. ElseIf (CInt(TextBox2.Text) > 1073741823) Then
    9. MsgBox("Addition ist nur mit Zahlen im Bereich zwischen -/+ 1073741823 möglich!")
    10. Else
    11. Label1.Text = CStr(CInt(TextBox1.Text) + CInt(TextBox2.Text))
    12. End If


    Hoffe mir kann jemand helfen :)
    MfG Jannes

    PS: Kommentare wie:" lern schreiben " oder " man is das billig " kann man sich auch verkneifen ... :!:
    das maximum ist das doppelte aber egal :thumbsup:
    kann ich dann nicht einfach die ergebnisse auch mit double ausrechnen lassen? :D denn kann ich mir das geprüfe doch sparen, oder? über "1,79769313486232E308" wird ja keiner rüberkommen :D
    denn kann ich mir das geprüfe doch sparen, oder?

    Was, wenn Du eine Zahl angibst, die für Double zu groß ist? (Wenn man schon mit so exzessiv großen Zahlen arbeitet, die über Integer.MaxValue / .MinValue gehen, sollte man sich gleich vollständig absichern).

    Grundliegend: Verwende das, was Du brauchst. Integer (also Ganzzahl) wird für einen Rechner nicht reichen. Also würde ich Double empfehlen. Wenn Du sehr sehr genaue Rechnungen durchführen willst (also dass keine Rundungsfehler auftreten), dann verwende Decimal.

    Als nächstes:
    Verwende (ich gehe jetzt mal vom Beispiel Double aus) Double.TryParse().
    Das funktioniert so:

    VB.NET-Quellcode

    1. Dim NeueDoubleZahl As Double
    2. If Double.TryParse(TextBoxMitEinemSinnvollenNamen.Text, NeueDoubleZahl) Then
    3. 'Zahl konnte problemlos geparst werden.
    4. Else
    5. 'Es gab Probleme.
    6. 'Das kann jetzt alles mögliche sein. Also wäre es z.B. sinnvoll den Text von TextBoxMitEinemSinnvollenNamen auf ungültige Zeichen zu überprüfen.
    7. End If



    Kleiner Tipp:
    TextBoxen sind für die Eingabe von Zahlen eher ungeeignet, da man "1231KommaEins" nicht in eine Zahl umwandeln kann. Ein NumericUpDown lässt von Anfang an nur Zahlen zu. Mit einstellbarer Anzahl an Nachkommastellen, Wertebereich, etc.
    Der Wert ist vom Datentyp Decimal.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Dim imax As Integer = Integer.MaxValue
    2. Dim imin As Integer = Integer.MinValue
    3. Dim lmax As Long = Long.MaxValue
    4. Dim lmin As Long = Long.MinValue
    5. Dim dmax As Decimal = Decimal.MaxValue
    6. Dim dmin As Decimal = Decimal.MinValue
    7. ' usw.
    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!
    Also die engaben fang ich über ascii code ab --> ich lasse nur zahlen und backspace zu ;) (na gut ... den punkt hab ich vergessen, aber den kann man ja schnell reinschreiben) :D

    VB.NET-Quellcode

    1. If Double.TryParse(TextBoxMitEinemSinnvollenNamen.Text, NeueDoubleZahl) Then


    Klappt :thumbsup: hatte es vorher mit "Trycast" probiert ... das wollte aber nicht...

    Naja danke an alle die sich die Mühe gemacht haben ;) war bestimmt nciht meine letzte Frage :)

    MfG Jannes

    Niko Ortner schrieb:

    denn kann ich mir das geprüfe doch sparen, oder?

    Was, wenn Du eine Zahl angibst, die für Double zu groß ist? (Wenn man schon mit so exzessiv großen Zahlen arbeitet, die über Integer.MaxValue / .MinValue gehen, sollte man sich gleich vollständig absichern).

    Grundliegend: Verwende das, was Du brauchst. Integer (also Ganzzahl) wird für einen Rechner nicht reichen. Also würde ich Double empfehlen. Wenn Du sehr sehr genaue Rechnungen durchführen willst (also dass keine Rundungsfehler auftreten), dann verwende Decimal.

    Als nächstes:
    Verwende (ich gehe jetzt mal vom Beispiel Double aus) Double.TryParse().
    Das funktioniert so:

    VB.NET-Quellcode

    1. Dim NeueDoubleZahl As Double
    2. If Double.TryParse(TextBoxMitEinemSinnvollenNamen.Text, NeueDoubleZahl) Then
    3. 'Zahl konnte problemlos geparst werden.
    4. Else
    5. 'Es gab Probleme.
    6. 'Das kann jetzt alles mögliche sein. Also wäre es z.B. sinnvoll den Text von TextBoxMitEinemSinnvollenNamen auf ungültige Zeichen zu überprüfen.
    7. End If



    Kleiner Tipp:
    TextBoxen sind für die Eingabe von Zahlen eher ungeeignet, da man "1231KommaEins" nicht in eine Zahl umwandeln kann. Ein NumericUpDown lässt von Anfang an nur Zahlen zu. Mit einstellbarer Anzahl an Nachkommastellen, Wertebereich, etc.
    Der Wert ist vom Datentyp Decimal.


    Die Zwei TextBoxen sind zwei Objekte mit der Eigenschaft (Visible = False). Die wurden nur hier eingefügt, um dem Rechner ein Minimum und ein Maximum zu geben.
    P.S
    TextBox1.Text = 100
    TextBox2.Text = 999999
    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.”
    -Unbekannt
    @HolySandvich
    1. Das macht keinen Unterschied. TextBoxen sollte man nicht für die Eingabe von Zahlen verwenden, wenn man es vermeiden kann.
    2.
    TextBox1.Text = 100
    TextBox2.Text = 999999
    Genau so soll man es nicht machen. Wenn überhaupt, müsstest Du die Integer zuerst in String konvertieren (Option Strict On), oder gleich "100" zuweisen. Aber auch das rechtfertigt nicht, versteckte TextBoxen als Ersatz für Variablen zu verwenden.

    PS:
    Mir ist klar, dass das Thema alt ist, aber das Besprochene hat u.U. noch Relevanz.


    Edit by Manschula: Thema mit Blick auf das Datum geschlossen!
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

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