Poradce při potížích s typy dat (Visual Basic)
Na této stránce jsou uvedeny některé běžné problémy, které mohou nastat při provádění operací na vnitřní datové typy.
Výrazy s plovoucí desetinnou čárkou nelze porovnat jako rovná
Při práci s plovoucí desetinnou čárkou (Jeden typ dat (Visual Basic) a Datový typ Double (Visual Basic)), nezapomeňte, že jsou uloženy jako binární čísla.To znamená, že jim nemůže obsahovat přesné zastoupení jakékoli množství, které není binární zlomek (formuláře k / (2 ^ n) kde k a n jsou celá čísla).Například 0,5 (= 1/2) a 0.3125 (= 5/16) lze konat přesné hodnoty vzhledem k tomu, že (= 1/5) 0,2 a 0,3 (= 3/10) mohou být pouze přibližné aproximace.
Z tohoto důvodu nepřesnosti, se nelze spoléhat na přesné výsledky při pracovat na hodnoty s plovoucí desetinnou čárkou.Zejména dvě hodnoty, které se rovnají teoreticky pravděpodobně mírně různé reprezentace.
Porovnat množství s plovoucí desetinnou čárkou |
Následující příklad ukazuje nesprávné i správné srovnání dvou Double hodnoty.
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))
V předchozím příkladu ToString metodu Double strukturu, takže jej můžete určit přesnost lepší než CStr používá klíčové slovo.Výchozí hodnota je 15 číslic, ale formát "G17" je rozšiřuje na 17 číslic.
Operátor mod přesné výsledky nevrací.
O nepřesnosti čárce úložiště Operátor MOD (Visual Basic) alespoň jeden z operandů po čárce může vrátit neočekávané výsledky.
Desetinný datový typ (Visual Basic) Nepoužívá reprezentace s plovoucí desetinnou čárkou.Počet čísel, které jsou nepřesné, v Single a Double jsou přesně v Decimal (například 0,2 a 0,3).Přestože aritmetické pomalejší v Decimal než v pohyblivé čárce, může být hodnotě snížení výkonu dosáhnout lepší přesnost.
Najít zbytek celé číslo s plovoucí desetinnou čárkou množství |
|
Následující příklad ukazuje potenciál nepřesnosti operandů s plovoucí desetinnou čárkou.
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))
V předchozím příkladu ToString metodu Double strukturu, takže jej můžete určit přesnost lepší než CStr používá klíčové slovo.Výchozí hodnota je 15 číslic, ale formát "G17" je rozšiřuje na 17 číslic.
Protože zeroPointTwo je Double, je jeho hodnota pro 0,2 nekonečně opakováním binární zlomek s uloženou hodnotou 0.20000000000000001.Vydělením tohoto množství 2.0 výnosů se zbytek 0.19999999999999991 9.9999999999999995.
Ve výrazu pro decimalRemainder, literálový znak D vynutí oba operandy na Decimal, 0,2 a přesná reprezentace.Proto Mod operátor výnosy očekávané zbytek 0,0.
To není dostatečné deklarovat decimalRemainder jako Decimal.Je také nutné vynutit literály se Decimal, nebo používat Double ve výchozím nastavení a decimalRemainder obdrží nepřesné stejnou hodnotu jako doubleRemainder.
Typu Boolean nepřevede na číselný typ přesně
Datový typ Boolean (Visual Basic)hodnoty nejsou uloženy jako čísla a čísla odpovídající nejsou určeny uložené hodnoty.Pro kompatibilitu se staršími verzemi Visual Basic obsahuje klíčová slova pro převod (Funkce CType (Visual Basic), CBool, CInt, a tak dále) k převodu mezi Boolean a číselné typy.Však jiné jazyky někdy provést tyto převody různě, stejně jako .NET Framework metod.
By nikdy napsat kód, který využívá odpovídající číselné hodnoty pro True a False.Kdykoli je to možné, by mělo být omezeno používání Boolean proměnné, logické hodnoty, pro které jsou určeny.Pokud musí zároveň Boolean a číselné hodnoty se ujistěte, že rozumíte metoda převodu, který vyberete.
Převod v jazyce Visual Basic
Při použití CType nebo CBool převodu klíčová slova k převodu číselné typy na Boolean, 0, stane se False a stanou se všechny hodnoty True.Při převodu Boolean hodnot na číselné typy pomocí klíčových slov pro převod, False se stane 0 a True se stane -1.
Převod v rámci
ToInt32 Metodu Convert třídy v System převede oboru názvů True k + 1.
Pokud musíte převést Boolean číselný datový typ hodnoty, dbejte o způsobu převodu použít.
Znak literálu generuje chyba kompilátoru
Neexistují žádné znaky typu Visual Basic předpokládá výchozí datové typy pro literály.Výchozí typ znakový literál – v uvozovkách (" ") – je String.
String Datový typ nelze rozšířit na Typ dat Char (Visual Basic).To znamená, že pokud chcete přiřadit literál na Char proměnné, musíte provést zužujícího převodu nebo literál k vynucení Char typu.
Vytvoření znak literálu přiřadit proměnné nebo konstanty |
|
Následující příklad ukazuje úspěšné i neúspěšné přiřazení literál na Char proměnné.
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")
Existuje vždy riziko pomocí zužujícího převodu, protože nesplní v době spuštění.Například převod z String na Char může selhat, pokud String hodnota obsahuje více než jeden znak.Proto je lepší programování pro použití C znak.
Řetězec převodu dojde v době spuštění
Datový typ String (Visual Basic) Účastní málo rozšiřujícího převodu.Stringrozšiřuje pouze sám na sebe a Objecta pouze Char a Char() ( Char matice) rozšířit na String.Důvodem je, že String proměnné a konstanty mohou obsahovat hodnoty, které nemohou obsahovat jiné datové typy.
Při přepnutí kontrola typu (Možnost přísné prohlášení) je On, kompilátor zakáže všechny implicitní zužujícího převodu.Zahrnuje ty zahrnující String.Kód můžete stále používat převod klíčová slova jako CStr a Funkce CType (Visual Basic), které přímo .NET Framework pokus o převod.
[!POZNÁMKA]
Chyba zúžení převodu je potlačena pro převody z prvků For Each…Next kolekci řídicí proměnná smyčky.Další informace a příklady naleznete v části "Zužující převody" v Pro každý...Další příkaz (Visual Basic).
Ochrana zužujícího převodu
Zužující převody Nevýhodou je, že může selhat při běhu.Například pokud String proměnná obsahuje nic než "Ano" nebo "Ne", nelze převést na Boolean.Obsahuje znaky interpunkce, převod na libovolný číselný typ se nezdaří.Pokud víte, že vaše String proměnné vždy obsahuje hodnoty, které můžete přijmout typ cíle, není převod vyzkoušejte.
Pokud musíte převést z String na jiný typ dat nejbezpečnější postup je pokus o převod v uvozovkách Zkuste...Úlovek...Nakonec prohlášení (Visual Basic).To vám umožňuje řešit selhání spuštění.
Znak matice
Jeden Char a pole Char prvky obou rozšířit na String.Však String nelze rozšířit na Char().Převést String hodnotu Char pole, můžete použít ToCharArray metodu System.String třídy.
Nesmyslné hodnoty
Obecně String hodnoty nejsou smysluplné v jiných typech dat a převod je vysoce umělé a nebezpečné.Kdykoli je to možné, by mělo být omezeno používání String proměnné znakové sekvence, které jsou určeny.Nikdy byste měli zapsat kód, který se opírá o ekvivalentní hodnoty v jiných typech.
Viz také
Referenční dokumentace
Souhrn typu dat (Visual Basic)
Funkce převodu typu (Visual Basic)
Koncepty
Datové typy jazyka Visual Basic
Efektivní využití typů dat (Visual Basic)