Почему редактор Visual Basic преобразует экспоненциальную запись в число со знаком # в конце?

Не могу найти информацию по этому поводу:

Я инициализирую переменную, и когда я ввожу число в экспоненциальном представлении, например 8.45673E11, но оно преобразует его в стандартную форму с составным знаком в конце 845673000000#, я хотел бы знать, должно ли это произойти? Есть ли параметр, который управляет этим автоматическим преобразованием? На что указывает составной знак?

Спасибо большое! Лана


person GeekyFreaky    schedule 27.08.2018    source источник
comment
8.45673E11 есть 845673000000. Преобразование не происходит. # означает, что это двойной литерал. См. это: stackoverflow.com/q/3301733/4996248   -  person John Coleman    schedule 27.08.2018
comment
Вы пробовали CDbl(ws.Cell().Value)?   -  person jcrizk    schedule 27.08.2018
comment
Привет, Джон, да, я понимаю, что это одно и то же число, но мне интересно, почему это происходит. Спасибо за ссылку на пост. Я проверю это.   -  person GeekyFreaky    schedule 27.08.2018
comment
Дело в том, что они не только имеют одинаковый номер, но и имеют один и тот же тип данных. Это может быть проблемой, если VBE автоматически преобразует тип double или float в целочисленный тип. Несколько раздражает, что он преобразует число в менее читаемую форму.   -  person John Coleman    schedule 27.08.2018
comment
Да, я согласен! Кроме того, мне интересно, знаете ли вы, почему и при каких обстоятельствах это происходит? Это просто автоматически для любого литерала в научной нотации? Я играю, и когда я объявляю переменную как Double и пытаюсь инициализировать ее числом, она все равно добавляет # в конце числа - независимо от того, в научной нотации или в виде стандартного числа. Кажется излишним?   -  person GeekyFreaky    schedule 27.08.2018
comment
Если вы введете целочисленное значение меньше 2^31-1, то VBE не будет добавлять никаких подсказок типа — преобразование (из Long или из Integer, если буквальное значение меньше 2^15-1) будет только произойдет позже, когда выражение будет вычислено. С подсказкой о типе преобразование происходит во время компиляции — в основном компилятор добавляет ярлыки для себя в исходный код.   -  person Mathieu Guindon    schedule 27.08.2018


Ответы (1)


Это происходит потому, что когда вы вводите код в VBE, то, что вы видите, НЕ является тем, что вы получаете.

Текущая строка кода представляет собой обычный текст: он не воспринимается как код, пока вы не нажмете клавишу ВВОД или не перейдете от этой строки. Затем под капотом происходит несколько вещей:

  • The VBE parses the current line of code, and determines if it can be compiled.
    • If it's an invalid statement, it either pops a "compile error" message box, or highlights the statement in red (depending on your VBE "compile on demand" settings).
  • Действительный код компилируется в инструкции P-Code и сохраняется вместе с исходным кодом в главном документе, хотя на данный момент все это все еще находится только в памяти.
  • P-код преобразуется обратно в исходный код VBA, а только что введенная строка кода перезаписывается на месте.

Итак, когда вы пишете Foo = 8.45673E11, VBE определяет, что правая часть присваивания является двойным литералом, и компилирует соответствующую инструкцию P-кода; когда эта инструкция преобразуется обратно в исходный код VBA, она «переписывается» как явный двойной литерал, 845673000000# (суффикс # является подсказкой типа, означающей «это Double "), потому что P-Code не заботится о представлении числа (например, научной нотации), а только само число; добавляется символ подсказка типа, так что тип уже известен и его не нужно повторно вычислять снова при следующей компиляции выражения.

И когда вы пишете Foo = 8.45673E11, вы все равно получаете Foo = 845673000000#, потому что P-Code не заботится о этих пробелах.

Вот почему при вводе Public Foo As Double при вводе foo = 123 вы получите Foo = 123, потому что во внутренней таблице символов есть Foo с F в верхнем регистре.

person Mathieu Guindon    schedule 27.08.2018
comment
Ура, это Матье! Еще раз спасибо за хорошо разъясненный ответ. Всего один короткий вопрос: что означает RHS? :) - person GeekyFreaky; 27.08.2018
comment
@GeekyFreaky это правая сторона, извините :) есть также LHS для левой стороны - эти термины часто используются всякий раз, когда выражение с участием оператора для ссылки на каждую часть выражения. Таким образом, выражение присваивания, такое как foo = 42, имеет LHS foo и RHS 42. - person Mathieu Guindon; 27.08.2018
comment
ОМГ, ух! Я должен был понять это. хахаха спасибо.^^ - person GeekyFreaky; 27.08.2018