Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Auf dieser Seite sind einige häufige Probleme aufgeführt, die auftreten können, wenn Sie Vorgänge für systeminterne Datentypen ausführen.
Floating-Point Ausdrücke werden nicht gleich verglichen
Wenn Sie mit Gleitkommazahlen (Single Data Type und Double Data Type) arbeiten, denken Sie daran, dass sie als binäre Bruchzahlen gespeichert werden. Dies bedeutet, dass sie keine genaue Darstellung einer Menge enthalten können, die kein binärer Bruch (der Form k / (2 ^ n) ist, wobei k und n ganze Zahlen sind. Beispielsweise können 0,5 (= 1/2) und 0,3125 (= 5/16) als genaue Werte gehalten werden, wohingegen 0,2 (= 1/5) und 0,3 (= 3/10) nur Annäherungen sein können.
Aufgrund dieser Ungenauigkeit können Sie sich nicht auf genaue Ergebnisse verlassen, wenn Sie auf Gleitkommawerten arbeiten. Insbesondere können zwei Werte, die theoretisch gleich sind, leicht unterschiedliche Darstellungen aufweisen.
| So vergleichen Sie Gleitkommamengen |
|---|
| 1. Berechnen Sie den absoluten Wert ihrer Differenz mithilfe der Abs Methode der Math Klasse im System Namespace. 2. Legen Sie einen akzeptablen Höchstunterschied fest, sodass Sie die beiden Mengen für praktische Zwecke berücksichtigen können, wenn ihre Differenz nicht größer ist. 3. Vergleichen Sie den absoluten Wert der Differenz mit der zulässigen Differenz. |
Das folgende Beispiel veranschaulicht sowohl einen falschen als auch einen korrekten Vergleich von zwei Double Werten.
Dim oneThird As Double = 1.0 / 3.0
Dim pointThrees As Double = 0.333333333333333
' The following comparison does not indicate equality.
Dim exactlyEqual As Boolean = (oneThird = pointThrees)
' The following comparison indicates equality.
Dim closeEnough As Double = 0.000000000000001
Dim absoluteDifference As Double = Math.Abs(oneThird - pointThrees)
Dim practicallyEqual As Boolean = (absoluteDifference < closeEnough)
MsgBox("1.0 / 3.0 is represented as " & oneThird.ToString("G17") &
vbCrLf & "0.333333333333333 is represented as " &
pointThrees.ToString("G17") &
vbCrLf & "Exact comparison generates " & CStr(exactlyEqual) &
vbCrLf & "Acceptable difference comparison generates " &
CStr(practicallyEqual))
Im vorherigen Beispiel wird die ToString Methode der Double Struktur verwendet, sodass sie eine bessere Genauigkeit angeben kann, als das CStr Schlüsselwort verwendet wird. Der Standardwert ist 15 Ziffern, aber das Format "G17" erweitert es auf 17 Ziffern.
Mod-Operator gibt kein genaues Ergebnis zurück.
Aufgrund des ungenauen Gleitkommaspeichers kann der Mod-Operator ein unerwartetes Ergebnis zurückgeben, wenn mindestens einer der Operanden Gleitkommakomma ist.
Der Dezimaldatentyp verwendet keine Gleitkommadarstellung . Viele Zahlen, die Single ungenau sind und Double genau in Decimal sind (z. B. 0,2 und 0,3). Obwohl Arithmetik langsamer Decimal als im Gleitkomma ist, lohnt es sich möglicherweise, die Leistung zu verringern, um eine bessere Genauigkeit zu erzielen.
| So ermitteln Sie den ganzzahligen Rest der Gleitkommamengen |
|---|
1. Deklarieren von Variablen als Decimal.2. Verwenden Sie das Literaltypzeichen D , um Literale zu Decimalerzwingen, falls ihre Werte für den Long Datentyp zu groß sind. |
Im folgenden Beispiel wird die potenzielle Ungenauigkeit von Gleitkommaopernden veranschaulicht.
Dim two As Double = 2.0
Dim zeroPointTwo As Double = 0.2
Dim quotient As Double = two / zeroPointTwo
Dim doubleRemainder As Double = two Mod zeroPointTwo
MsgBox("2.0 is represented as " & two.ToString("G17") &
vbCrLf & "0.2 is represented as " & zeroPointTwo.ToString("G17") &
vbCrLf & "2.0 / 0.2 generates " & quotient.ToString("G17") &
vbCrLf & "2.0 Mod 0.2 generates " &
doubleRemainder.ToString("G17"))
Dim decimalRemainder As Decimal = 2D Mod 0.2D
MsgBox("2.0D Mod 0.2D generates " & CStr(decimalRemainder))
Im vorherigen Beispiel wird die ToString Methode der Double Struktur verwendet, sodass sie eine bessere Genauigkeit angeben kann, als das CStr Schlüsselwort verwendet wird. Der Standardwert ist 15 Ziffern, aber das Format "G17" erweitert es auf 17 Ziffern.
Der zeroPointTwo Wert für 0,2 ist Doubleein unendlich wiederholter binärer Bruch mit einem gespeicherten Wert von 0,20000000000001. Die Division von 2,0 durch diese Menge ergibt 9,9999999999999995 mit einem Rest von 0,1999999999999991.
Im Ausdruck für decimalRemainder, das Literaltypzeichen D erzwingt sowohl Operanden zu Decimal, als auch 0,2 eine genaue Darstellung. Daher liefert der Mod Betreiber den erwarteten Rest von 0,0.
Beachten Sie, dass es nicht ausreicht, um als Decimaldeklariert zu werdendecimalRemainder. Sie müssen auch erzwingen, dass die Literale Decimalverwendet werden, oder sie werden standardmäßig verwendet Double und decimalRemainder erhalten denselben ungenauen Wert wie doubleRemainder.
Boolescher Typ konvertiert nicht korrekt in numerischen Typ
Boolesche Datentypwerte werden nicht als Zahlen gespeichert, und die gespeicherten Werte sind nicht für Zahlen vorgesehen. Aus Gründen der Kompatibilität mit früheren Versionen stellt Visual Basic Konvertierungstichwörter (CType-Operator, , CIntusw.) bereit, CBoolum zwischen Boolean und numerischen Typen zu konvertieren. Andere Sprachen führen diese Konvertierungen jedoch manchmal anders aus, wie die .NET Framework-Methoden.
Sie sollten niemals Code schreiben, der auf entsprechenden numerischen Werten für True und False. Wenn möglich, sollten Sie die Verwendung von Boolean Variablen auf die Wahrheitswerte beschränken, für die sie konzipiert sind. Wenn Sie numerische Werte kombinieren und numerische Werte verwenden Boolean müssen, stellen Sie sicher, dass Sie die von Ihnen ausgewählte Konvertierungsmethode verstehen.
Konvertierung in Visual Basic
Wenn Sie die CType Schlüsselwörter oder CBool Konvertierungsstichwörter verwenden, um numerische Datentypen zu Booleankonvertieren, wird 0 und False alle anderen Werte werden True. Wenn Sie Werte mithilfe der Konvertierungsstichwörter in numerische Typen konvertieren Boolean , False wird 0 und True wird zu -1.
Konvertierung im Framework
Die ToInt32 Methode der Convert Klasse im System Namespace wird in +1 konvertiert True .
Wenn Sie einen Wert in einen Boolean numerischen Datentyp konvertieren müssen, achten Sie darauf, welche Konvertierungsmethode Sie verwenden.
Zeichenliteral generiert Compilerfehler
Wenn keine Typzeichen vorhanden sind, geht Visual Basic von Standarddatentypen für Literale aus. Der Standardtyp für ein Zeichenliteral , das in Anführungszeichen (" ") eingeschlossen ist, lautet String.
Der String Datentyp wird nicht auf den Char-Datentyp erweitert. Dies bedeutet, dass Sie, wenn Sie einer Char Variablen ein Literal zuweisen möchten, entweder eine Schmalungskonvertierung vornehmen oder das Literal zum Typ erzwingen müssen Char .
| So erstellen Sie ein Char-Literal, das einer Variablen oder Konstante zugewiesen werden soll |
|---|
1. Deklarieren Sie die Variable oder Konstante als Char.2. Schließen Sie den Zeichenwert in Anführungszeichen ( " ") ein.3. Folgen Sie dem schließenden doppelten Anführungszeichen mit dem Literaltypzeichen C , um das Literal zu Charerzwingen. Dies ist erforderlich, wenn der Typüberprüfungsschalter (Option Strict Statement) ist Onund in jedem Fall wünschenswert ist. |
Im folgenden Beispiel werden sowohl erfolglose als auch erfolgreiche Zuordnungen eines Literals zu einer Char Variablen veranschaulicht.
Dim charVar As Char
' The following statement attempts to convert a String literal to Char.
' Because Option Strict is On, it generates a compiler error.
charVar = "Z"
' The following statement succeeds because it specifies a Char literal.
charVar = "Z"c
' The following statement succeeds because it converts String to Char.
charVar = CChar("Z")
Es besteht immer ein Risiko bei der Verwendung von Schmalungskonvertierungen, da sie zur Laufzeit fehlschlagen können. Eine Konvertierung von String zu Char "in" kann z. B. fehlschlagen, wenn der String Wert mehr als ein Zeichen enthält. Daher ist es besser, das C Typzeichen zu verwenden.
Fehler bei der Zeichenfolgenkonvertierung zur Laufzeit
Der Datentyp "Zeichenfolge " nimmt an wenigen Erweiterungskonvertierungen teil.
Stringbreitet sich nur auf sich und Objectund (ein Char Array) auf String.Char()Char Dies liegt daran, dass String Variablen und Konstanten Werte enthalten können, die andere Datentypen nicht enthalten können.
Wenn der Schalter für die Typüberprüfung (Option Strict-Anweisung) lautet On, verbietet der Compiler alle impliziten Eingrenzungskonvertierungen. Dazu gehören auch diejenigen, die beteiligt sind String. Ihr Code kann weiterhin Konvertierungsstichwörter wie CStr z. B. den CType-Operator verwenden, der .NET Framework angibt, um die Konvertierung zu versuchen.
Hinweis
Der Verengungsfehler wird für Konvertierungen aus den Elementen in einer For Each…Next Auflistung in die Variable des Schleifensteuerelements unterdrückt. Weitere Informationen und Beispiele finden Sie im Abschnitt "Verengung von Konvertierungen" in For Each... Next-Anweisung.
Schutz für die Verengung von Konvertierungen
Der Nachteil von Verengungskonvertierungen besteht darin, dass sie zur Laufzeit fehlschlagen können. Wenn eine String Variable beispielsweise einen anderen Wert als "True" oder "False" enthält, kann sie nicht in Boolean. Wenn sie Interpunktionszeichen enthält, schlägt die Konvertierung in einen numerischen Typ fehl. Wenn Sie nicht wissen, dass Ihre String Variable immer Werte enthält, die der Zieltyp akzeptieren kann, sollten Sie keine Konvertierung versuchen.
Wenn Sie von String einem anderen Datentyp konvertieren müssen, besteht die sicherste Prozedur darin, die versuchte Konvertierung in das Try- Fangen... Abschließende Anweisung. Auf diese Weise können Sie mit einem Laufzeitfehler umgehen.
Zeichenarrays
Ein einzelnes Char Und ein Array von Char Elementen, die Stringbeide auf .
String Breitet sich jedoch nicht auf Char(). Um einen String Wert in ein Char Array zu konvertieren, können Sie die ToCharArray Methode der System.String Klasse verwenden.
Bedeutungslose Werte
Im Allgemeinen String sind Werte in anderen Datentypen nicht aussagekräftig, und die Konvertierung ist sehr künstlich und gefährlich. Wenn möglich, sollten Sie die Verwendung von String Variablen auf die Zeichensequenzen beschränken, für die sie konzipiert sind. Sie sollten niemals Code schreiben, der auf gleichwertigen Werten in anderen Typen basiert.