Cамоучитель по VB.NET

       

Математические операции




Оператор
Операция
+ Сложение
- Вычитание (и обозначение отрицательных чисел)
/ Деление (преобразование к Double — не может вызвать исключение DivideByZero; см. главу 7)
\ Целочисленное деление (без преобразования — может вызвать исключение DivideByZero)
* Умножение
^ Возведение в степень

Чтобы лучше разобраться в разных типах деления, можно воспользоваться методом .NET GetType. В командах вывода (таких как WriteLine) этот метод возвращает имя типа в строковом представлении. Рассмотрим следующую программу:

Module Modulel

Sub Main()

Console.WriteLine((4 / 2).GetType())

Console. ReadLine()

End Sub

End Module

В консольном окне выводится строка

System.Double

Возможности метода GetType не ограничиваются простым выводом имени — в частности, он используется в процессе рефлексии. Механизм рефлексии описан в главе 4.

Ниже приведен пример ситуации, в которой необходимо учитывать тип значения, возвращаемого оператором деления. Перед нами простая (но нерабочая) версия программы, преобразующей температуру по Цельсию в температуру по Фаренгейту. В выделенной строке отсутствует суффикс @, преобразующий результат деления к типу Decimal:

Option Strict On

Module Modulel Sub Main()

Dim cdeg As Decimal

Console.. Writer Enter the degrees in centigrade...")

cdeg=CDec(Console.ReadLine())

Dim fdeg As Decimal

fdeg = (((9 / 5) * cdeg) + 32)

Console.WriteLine(cdeg & " is " & fdeg & " degrees Fahrenheit.")

Console. ReadLine()

End Sub

End Module

Из-за присутствия знака / в выделенной строке переменной fdeg присваивается результат типа Double. В режиме жесткой проверки типов это приводит к тому, что на стадии компиляции будет выдано следующее сообщение об ошибке:

Option Strict disallows implicit conversions from Double to Decimal.

Как исправить ошибку? Только не надо убирать команду Option Strict — это одно из лучших новшеств VB .NET, которое избавляет вас от злостного искажения типов. Лучше воспользуйтесь суффиксом @ или преобразуйте выражение (полностью или частично) к типу Decimal. Пример:

fdeg = ((CDec(9 / 5) * cdeg) + 32)

Поскольку результат деления преобразуется к типу Decimal, результат тоже относится к типу Decimal.

Остается лишь заметить, что в этом простом примере мы используем метод Write вместо Wri teLi ne, чтобы предотвратить перевод строки после вывода текста. Кроме того, в реальной программе введенные данные следовало бы предварительно проанализировать, потому что пользователи часто ошибаются при вводе.

Наконец, вещественное деление в VB .NET соответствует стандарту IEEE, поэтому вместо ошибки деления на ноль теперь происходит нечто странное. Пример:

Sub Main()

Dim getData As String

Dim x, у As Double

x = 4

У = 0

Console.WriteLine("What is 4/0 in VB .NET? " & x / y)

Console.ReadLine()

End Sub

Результат выглядит так:

What is 4/0 in VB. NET? Infinity

Результат деления 0/0 равен

NaN (Not A Number, «не является числом»).

В табл. 3.8 перечислены операторы, используемые только при делении чисел типа Integer и Long.



Содержание раздела