Объявите переменную как Decimal

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

Как объявить Dim decAsdf as Decimal (не так, а правильно)?


person Thomas Shera    schedule 18.06.2015    source источник


Ответы (3)


Вы не можете объявить переменную как Decimal — вы должны использовать Variant (хотя вы можете использовать CDec, чтобы заполнить ее типом Decimal).

person Rory    schedule 18.06.2015
comment
Например: Dim v: v = CDec("123456789.123456789") - person Rory; 18.06.2015
comment
Итак, каждое десятичное число объявляется в другой строке? - person Thomas Shera; 18.06.2015
comment
Я не знаю, что вы имеете в виду. Объявление представляет собой Dim, который ничем не отличается от любого другого типа переменной. - person Rory; 18.06.2015
comment
Будет ли это правильным примером: Dim decMeanComp: decMeanComp = CDec(1234) - person Thomas Shera; 18.06.2015
comment
Да. Просто чтобы уточнить - объявление и присваивание не обязательно должны быть в одной строке, я просто не могу публиковать отдельные строки кода в комментарии! - person Rory; 18.06.2015

Чтобы объявить переменную как Decimal, сначала объявите ее как Variant, а затем преобразуйте в Decimal с помощью CDec. Тип будет Variant/Decimal в окне просмотра:

введите здесь описание изображения

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

В приведенном ниже примере мы видим, что выражение:

0.1 + 0.11 = 0.21

либо True, либо False, в зависимости от того, объявлены ли предметы коллекционирования (0.1,0.11) как Double или как Decimal:

Public Sub TestMe()

    Dim preciseA As Variant: preciseA = CDec(0.1)
    Dim preciseB As Variant: preciseB = CDec(0.11)

    Dim notPreciseA As Double: notPreciseA = 0.1
    Dim notPreciseB As Double: notPreciseB = 0.11

    Debug.Print preciseA + preciseB
    Debug.Print preciseA + preciseB = 0.21 'True

    Debug.Print notPreciseA + notPreciseB
    Debug.Print notPreciseA + notPreciseB = 0.21 'False

End Sub

введите здесь описание изображения

person Vityata    schedule 01.06.2020

Лучший способ — объявить переменную как Single или Double в зависимости от необходимой точности. Тип данных Single использует 4 байта и имеет диапазон от -3,402823E38 до 1,401298E45. Double использует 8 байт.

Вы можете объявить следующим образом:

Dim decAsdf as Single

or

Dim decAsdf as Double

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

Sub doubleDataTypeExample()
Dim doubleTest As Double


doubleTest = 0.0000045 * 0.005 * 0.01

MsgBox "doubleTest = " & doubleTest
End Sub
person daytonrazorback    schedule 18.06.2015