Benutzer mit den meisten Antworten
\-Teilung von großen decimal-Werten: Problem

Frage
-
moin,
wenn ich große Werte in einer Decimal-Variablen mit dem \-Operator teilen möchte gibts einen Uberlauffehler.
Beispiel: 12345678901234567890 \ 62
die Hilfe schreibt zwar zu unterstützten typen:
Alle numerischen Typen, einschließlich Typen ohne Vorzeichen, Gleitkommatypen sowie Decimal.
aber auch:
Vor dem Ausführen der Division versucht Visual Basic, einen numerischen Gleitkommaausdruck in Long zu konvertieren.Wenn Option StrictOn ist, tritt ein Compilerfehler auf.Ist Option StrictOff, kann eine OverflowException-Ausnahme ausgelöst werden, wenn der Wert außerhalb des Bereichs von Long-Datentyp (Visual Basic) liegt.
Kann ich dieses Problem umschiffen?
Gruß und Dank!
Thomas
Antworten
-
Hi Thomas,
ich hatte übersehen, dass Du eine Ganzzahldivision ausführst. Bei einer Ganzzahldivision "\" wird ein Long durch einen anderen Long geteilt. Deine lange erste Dezimalzahl lässt sich aber nicht in ein Long umwandeln, da sie zu lang ist. Deshalb funktioniert auch keine implizite Typkonvertierung (Option Strict Off). Für Deinen Fall eignet sich die Divide-Methode, z.B. so:Dim var1 As Decimal = 12345678901234567890D Dim var2 As Decimal = 62D Dim res As Decimal = Math.Ceiling(Decimal.Divide(var1, var2))
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Bearbeitet Peter Fleischer Freitag, 12. Januar 2018 13:28
- Als Antwort markiert Migration Sucks Freitag, 12. Januar 2018 13:38
Alle Antworten
-
Hi Thomas,
der Divisions-Operator "/" erwartet 2 Double-Zahlen und ergibt auch Double. Wenn due keine implizite Typkonvertierung wegen Option Strict On nutzt, dann musst Du die Dezimalzahlen selbst konvertieren, z.B. so:Dim var1 As Decimal = 12345678901234567890D Dim var2 As Decimal = 62D Dim var1d As Double = var1 ' widening conversion! Dim var2d As Double = var2 Dim resD As Double = var1d / var2d Dim res As Decimal = Convert.ToDecimal(resD)
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks
- Bearbeitet Peter Fleischer Freitag, 12. Januar 2018 11:13
-
1. Danke Peter, ich verwende den \-Operator, nicht den /-Operator, aber wahrscheinlich trifft das mit dem double hier auch zu? Geht allerdings nicht aus der Hilfe hervor, was Du schreibst.
2. Ich habe option strict off. Sollte es da nicht automatisch korrekt konvertiert werden?
3. Double hat 64 bit, decimal 128 bit. Ist da nicht der Werteumfang von Ganzzahlen von decimal größer als von double?
-
Hi Thomas,
ich hatte übersehen, dass Du eine Ganzzahldivision ausführst. Bei einer Ganzzahldivision "\" wird ein Long durch einen anderen Long geteilt. Deine lange erste Dezimalzahl lässt sich aber nicht in ein Long umwandeln, da sie zu lang ist. Deshalb funktioniert auch keine implizite Typkonvertierung (Option Strict Off). Für Deinen Fall eignet sich die Divide-Methode, z.B. so:Dim var1 As Decimal = 12345678901234567890D Dim var2 As Decimal = 62D Dim res As Decimal = Math.Ceiling(Decimal.Divide(var1, var2))
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Bearbeitet Peter Fleischer Freitag, 12. Januar 2018 13:28
- Als Antwort markiert Migration Sucks Freitag, 12. Januar 2018 13:38
-
ok, Ganzzahldivision liefert die kleinere Ganzzahl (Floor) :-)
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks