Декларирайте променлива като 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