Sdílet prostřednictvím


Řešení potíží s datovými typy (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 (Single – datový typ (Visual Basic) a Double – datový typ (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

  1. Výpočet pomocí absolutní hodnota rozdílu jejich Abs metodu Math třídy v System oboru názvů.

  2. Určete přijatelné maximální rozdíl, můžete zvážit dvě rovná pro praktické účely, pokud jejich rozdíl je větší množství.

  3. Porovnejte absolutní hodnota rozdílu přijatelný rozdíl.

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ě Mod – operátor (Visual Basic) alespoň jeden z operandů po čárce může vrátit neočekávané výsledky.

Decimal – 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í

  1. Deklarování proměnných jako Decimal.

  2. Použít literálový znak D vynutit literály na Decimal, v případě, že jejich hodnoty jsou příliš velké Long datového typu.

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ě

Boolean – datový typ (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 (CType – funkce (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 Char – datový typ (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

  1. Deklarovat proměnnou nebo konstantu Char.

  2. Hodnota znaku uzavřete do uvozovek (" ").

  3. Postupujte uzavírací uvozovky literálový znak C vynutit literál na Char.Je to nezbytné, pokud kontrola typu přepínače (Option Strict – příkaz) je On, a je žádoucí, aby v žádném případě.

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í

String – datový typ (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 (Option Strict – příkaz) 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 CType – funkce (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 For Each...Next – 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 Try...Catch....Finally – příkaz (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 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 datových typů (Visual Basic)

Funkce pro převod typů (Visual Basic)

Koncepty

Datové typy v jazyce Visual Basic

Znaky typu (Visual Basic)

Typy hodnot a typy odkazu

Účinné používání datových typů (Visual Basic)

Další zdroje

Převody typů v jazyce Visual Basic