NaN, Infinity un Divide by Zero VB.NET

Sākuma programmēšanas grāmatās parasti ir šāds brīdinājums: “Nedaliet ar nulli! Jūs saņemsit izpildlaika kļūdu! "

Lietas ir mainījušās VB.NET. Lai gan ir vairāk programmēšana iespējas un aprēķins ir precīzāks, ne vienmēr ir viegli saprast, kāpēc lietas notiek tā, kā tās notiek.

Šeit mēs uzzinām, kā rīkoties ar dalīšanu ar nulli, izmantojot VB.NET strukturēto kļūdu apstrādi. Pa ceļam mēs aptveram arī jaunās VB.NET konstantes: NaN, Infinity un Epsilon.

Kas notiek, ja VB.NET palaižat “Divide By Zero”

Ja VB.NET palaižat scenāriju “dalīt ar nulli”, tiek parādīts šāds rezultāts:

 Dim a, b, c kā dubultā

 a = 1: b = 0

 c = a / b

 Konsole. WriteLine (_

 "Vai ir matemātikas noteikumi" _

 & vbCrLf & _

 "tika atcelts?" _

 & vbCrLf & _

 "Dalījums ar nulli" _

 & vbCrLf & _

 "jābūt iespējamam!") 

Kas tad šeit notiek? Atbilde ir tāda, ka VB.NET faktiski sniedz jums matemātiski pareizu atbildi. Matemātiski jūs var daliet ar nulli, bet tas, ko jūs saņemat, ir "bezgalība".

 Dim a, b, c kā dubultā

 a = 1: b = 0

 c = a / b

 Konsole. WriteLine (_

 "Atbilde ir:" _

 & c)

 'Displeji:

 'Atbilde ir: bezgalība 

instagram viewer

Vērtība "bezgalība" nav pārāk noderīga lielākajai daļai biznesa lietojumprogrammu. (Ja vien izpilddirektors nedomā, kāda ir viņa akciju prēmijas augšējā robeža.) Bet tas tomēr neļauj jūsu lietojumprogrammām sabrukt ar izpildlaika izņēmumu, kā to dara mazāk spēcīgās valodas.

VB.NET sniedz jums vēl lielāku elastību, pat ļaujot veikt aprēķinus. Pārbaudiet šo:

 Dim a, b, c kā dubultā

 a = 1: b = 0

 c = a / b

 c = c + 1

 'Bezgalība plus 1 ir

 'joprojām bezgalība 

Lai saglabātu matemātisku pareizību, VB.NET sniedz atbildi NaN (nav skaitlis) dažiem aprēķiniem, piemēram, 0/0.

 Dim a, b, c kā dubultā

 a = 0: b = 0

 c = a / b

 Konsole. WriteLine (_

 "Atbilde ir:" _

 & c)

 'Displeji:

 'Atbilde ir: NaN 

VB.NET var arī pateikt atšķirību starp pozitīvo bezgalību un negatīvo bezgalību:

 Dim a1, a2, b, c As Double

 a1 = 1: a2 = -1: b = 0

 Ja (a1 / b)> (a2 / b), tad _

 Konsole. WriteLine (_

 "Pozitīvā bezgalība ir" _

 & vbCrLf & _

 "pārāks nekā" _

 & vbCrLf & _

 "negatīva bezgalība.") 

Papildus PositiveInfinity un NegativeInfinity VB.NET nodrošina arī Epsilon, mazāko pozitīvo Double vērtību, kas ir lielāka par nulli.

Ņemiet vērā, ka visas šīs jaunās VB.NET iespējas ir pieejamas tikai ar peldošā komata (dubultā vai viena) datu tipiem. Un šī elastība var radīt zināmu neizpratni par mēģinājumiem, beidzot un beidzot (strukturēta kļūdu apstrāde). Piemēram, iepriekš norādītais .NET kods darbojas bez jebkāda veida izņēmuma, tāpēc koda kodēšana bloķēšanas mēģinājumos, beidzot saņemot, nepalīdzēs. Lai pārbaudītu dalījumu ar nulli, jums būs jākodē tāds tests:

 Ja c. ToString = "Infinity" Tad... 

Pat ja jūs kodējat programmu (izmantojot Integer, nevis Single vai Double tipus), jūs joprojām saņemat izņēmumu “Overflow”, nevis “Divide by Zero” izņēmumu. Ja tīmeklī meklējat citu tehnisko palīdzību, pamanīsit, ka visi piemēri pārbauda OverflowException.

.NET faktiski ir DivideByZeroException kā likumīgs tips. Bet, ja kods nekad neizraisīs izņēmumu, kad jūs kādreiz redzēsit šo nenotveramo kļūdu?

Kad jūs redzēsit DivideByZeroException

Kā izrādās, MicrosoftMSDN lapa par blokiem Try-Catch-beidzot faktiski izmanto dalīšanas ar nulli piemērus, lai parādītu, kā tos kodēt. Bet tur ir smalks "nozveja", ko viņi neizskaidro. Viņu kods izskatās šādi:

 Dim a kā vesels skaitlis = 0

 Dim b Kā vesels skaitlis = 0

 Dim c Kā vesels skaitlis = 0


 Izmēģiniet

 a = b \ c

 Nozvejas izņēmums

 Konsole. WriteLine ("Radās izpildes laika kļūda")

 Visbeidzot

 Konsole. Lasīšanas līnija ()

 Beigt mēģināt 

Šis kods dara izsauc faktisko dalījumu ar nulles izņēmumu.

Bet kāpēc šis kods izsauc izņēmumu, un nekas, ko mēs esam iepriekš kodējuši, to nedara? Un ko Microsoft neizskaidro?

Ņemiet vērā, ka operācija, ko viņi izmanto, ir dalīt ("/"), tas ir vesels skaitlis dalījums ("\")! (Citos Microsoft piemēros mainīgos lielumus faktiski deklarē kā veselus skaitļus.) Kā izrādās, vesela skaitļa aprēķins ir tikai lieta, kas faktiski rada šo izņēmumu. Būtu bijis jauki, ja Microsoft (un pārējās lapas, kas kopē savu kodu) paskaidro šo sīko detaļu.

instagram story viewer