vba: что такое 97.45 * 1# =?



some_integer = 97.45 * 1#


Что означает эта запись? что будет some_integer = ?

459   5  

5 ответов:

Просто чтобы расширить то, что добавили все остальные... Как уже упоминалось, хэш-метка ( # ) является символом объявления типа (TDC) и заставляет литерал "1" к типу Double. Это преобразование типа данных относится к классу преобразований, называемых "явными преобразованиями". Также в этом классе находятся приведения (такие как CStr(), CLng () и др.).

Явное преобразование обычно используется для того, чтобы избежать неправильного неявного преобразования. Неявное преобразование-это преобразования, которые выполняет VBA автоматически. Если вы объявите и введете все свои переменные (Пример Dim j As Long), то вам будет легче управлять интерпретацией данных. Однако есть еще несколько крайних случаев, связанных с тем, как обрабатываются литералы ("жестко закодированные числа").

Наиболее распространенные причины, по которым я знаю, чтобы использовать символы объявления типа с литералом:

  1. принуждение шестнадцатеричных и Восьмеричных литералов к лонгам, чтобы избежать известной проблемы. (Подробнее здесь: http://support.microsoft.com/kb/38888 )
  2. предотвращение общее условие переполнения, возникающее, когда математическая операция дает результат, который больше, чем самый большой тип данных, используемый в операции.
  3. избегая аномалии вычисления с плавающей запятой.
  4. Микрооптимизация. Преобразования, вызванные символом объявления типа, происходят во время компиляции. Приведенные преобразования и неявные преобразования происходят во время выполнения. В 99,999% случаев это не даст никакой измеримой выгоды и, как правило, является пустой тратой времени.

Как ваш пример ничего не делает, я могу только догадываться, что это не настоящий код. Таким образом, это затрудняет интуитивное понимание намерения автора. 1 не применяется. Причина 2-это возможность. Я опишу проблему и возможное решение.

Есть две вещи, которые вы должны знать, чтобы понять проблему переполнения. Как типизируются литералы и как работает неявное преобразование. Если символ объявления типа отсутствует, Литералу будет присвоен тип по умолчанию. Вот правила:
  1. Если значение в кавычках, это строка, даже если это числовое значение.
  2. Если значение числовое и имеет десятичную дробь, то оно является двойным.
  3. Если значение числовое, имеет нет десятичное и находится между -32,767 и 32,767 (включительно), то оно имеет тип Integer.
  4. Если значение числовое, не имеет никакого десятичного знака и находится между -2,147,483,647 и 2,147,483,647 (включительно), но не между -32,767 и 32,767, то оно имеет тип Long.
  5. Если значение равно числовой, не имеетникакой десятичной, и вне диапазона от -2,147,483,647 до 2,147,483,647 он имеет тип Double.
  6. Любой литерал в научной нотации будет двойным.
Теперь, когда вы знаете, как будет набираться литерал, вам нужно понять неявное преобразование. Все математические операции работают с двумя входными значениями и выводят один результат. Тип данных результата выбирается путем анализа типов данных входных значений. Тип выходных данных выбирается на основе три правила: 1. Если одно из входных значений относится к варианту типа данных, VBA выберет выходной тип данных на основе тех же правил, которые описаны для литералов. 2. Если оба входных значения типизированы, то он выберет больший из двух типов данных. 3. Если оба входных значения типизированы одинаково, то тип выходных данных будет таким же, как и тип входных данных (при условии, что этот тип не является "вариантом").

Проблема возникает Для условия 3. Если у вас есть два целых числа (напр. 500 и 400) и вы выполняете операция на них (исх. 500*400), что дает результат (200 000) для больших, чтобы поместить в результирующий тип данных (целое число). Затем вы получаете ошибку переполнения. Поскольку 500 и 400 по умолчанию являются целыми числами, вам придется избежать этого, явно введя один из них в Long или Double через символ объявления типа (ex. 500 и * 400). Затем, когда был выбран тип вывода, он выбрал бы больший из двух (длинный), который был бы достаточно большим, чтобы удержать результат.

Я могу с уверенностью сказать, что если причина была 2, то нет причин для беспокойства (по крайней мере, в данном примере). Любой литерал с десятичной запятой по умолчанию имеет тип Double. Поскольку неявное преобразование всегда выбирает самый большой тип в операции, и двойник всегда будет присутствовать, существует нулевая вероятность того, что переполнение произойдет, несмотря ни на что.

Если причиной для беспокойства является проблема с плавающей точкой, это потребует более серьезного рассмотрения с реальным примером, чтобы иметь возможность увидеть, если вам нужно символ объявления типа.

Если причиной была Микрооптимизация, то на самом деле не имеет значения, оставите вы ее там или нет. Технически, лучше использовать дубль с дублем. Так что нет никакого вреда в том, чтобы оставить его. Тем не менее, нет никаких причин, чтобы пойти из вашего пути, чтобы положить его в любом случае.


Разное

Различные символы объявления типа следующие:

Type Declaration Character Data Type
          %                 Integer
          &                 Long
          !                 Single
          #                 Double
          $                 String
          @                 Currency 

Чтобы добавить немного больше информации: Символ объявления типа может использоваться на месте их соответствующий тип в Туманном утверждении(хотя это считается многими плохой практикой). Таким образом: Dim s As String то же самое, что Dim s$ s будет создан как строка в обоих случаях. Аналогично, вы можете ввести возвращаемое значение функции с помощью TDCs. Так что Public Function MyFunc()& - это то же самое, что и Public Function MyFunc() As Long.


Функции Преобразования

Function    Return Type
CBool       Boolean
CByte       Byte
CCur        Currency 
CDate       Date 
CDbl        Double 
CDec        Decimal
CInt        Integer
CLng        Long
CSng        Single
CStr        String
CVar        Variant

some_integer будет 97.45.

Он используется для обработки 1 как двойника, а не любого другого типа. (Например, 1 можно рассматривать как целое число, но в этом случае мы хотим рассматривать 1 как двойник)

Вы можете думать о нем как о some_integer = 97.45 * 1# как о том же самом, что и some_integer = 97.45 * 1.00

1# означает "1 как двойник". Конечно, если some_integer является целым числом , то нецелые части результирующего выражения будут усечены до 97 (и поэтому я не понимаю, что он делает в этом случае).

Информация: символ объявления типа диаграммы типов данных (в VBA)

A # в VB означает "типа Double".

Так что some_integer будет 97.

1# означает, что 1оценивается как двойной .

Хотя я сомневаюсь, что это будет иметь какое-либо значение для этого расчета. Расчет будет по-прежнему дают 97.45 если 1 был без отделки и, таким образом, рассматривается как целое. И когда результат вычисления будет присвоен целому числу some_integer, он будет равен 97.
Sub Macro1()
    Dim i As Integer
    i = 97.45 * 1#
    MsgBox (i) 'Shows 97
End Sub

Comments

    Ничего не найдено.