Тема: Арифметика в VBA

Как такое может быть?????????????
Private Sub CommandButton1_Click()
Dim X(11) As Double
Dim i As Integer
Dim Count As Double
X(0) = 8.888
X(1) = 8.888
X(2) = 8.888
X(3) = 8.888
X(4) = 8.888
X(5) = 8.888
X(6) = 8.888
X(7) = 8.888
X(8) = 8.888
X(9) = 8.888
X(10) = 8.888
X(11) = 2.232
Count = 0
For i = 0 To 11
    Count = Count + X(i)
Next i
If Count <> 100# Then MsgBox ("Как не равно 100 ?????")
End Sub

Re: Арифметика в VBA

If Format(Count, "0.000") <> Format(100#, "0.000") Then MsgBox ("Как не равно 100 ?????")

Re: Арифметика в VBA

> AHTOH
Double в данном случае не оправдано. Похоже, при вычислениях появляются числа далеко стоящие после запятой. Которые в вычислениях участвуют но на экране не отображаются.
С Single все работает.

Re: Арифметика в VBA

Да, действительно, если взять

If round(Count, 10) <> 100# Then MsgBox ("Как не равно 100 ?????")

то получается.
Только:

brigval пишет:

Похоже, при вычислениях появляются числа далеко стоящие после запятой.

-откуда они там берутся-то, тем более при суммировании?! :)

Re: Арифметика в VBA

Народ, давайте посмотрим на формат Double:

Double variables are stored as signed IEEE 64-bit (8-byte) double-precision floating-point numbers ranging in value from -1.79769313486231570E+308 through -4.94065645841246544E-324 for negative values and from 4.94065645841246544E-324 through 1.79769313486231570E+308 for positive values.

Взято из MDSN .NET 2002
Т.е. Double не содержит как таковой "чистого" нуля, отсюда и "числа далеко после запятой".

Re: Арифметика в VBA

Конечно, точностью вычислений следует управлять.
Либо с помощью форматирования, как предложил Q, либо с помощью выбора типа данных. Иначе замучают "хвосты" после запятой. Причем, то что вылезает при сложении это еще цветочки, а что бывает при делении? При отладке одной из программ с большим кол-вом вычислений я был вынужден отказаться от встроенных операторов деления и делить вручную (с помощью цикла).
В этом примере обратите внимание на два последних результата:

Sub Math_Test()
    Dim M As Single
    Dim N As Single
    Dim i As Integer
    Dim j As Single
    Dim d As Double
    Dim c As Currency
    M = 347#
    N = 17#
    i = M / N
    MsgBox "i = " & i
    j = M / N
    MsgBox "j = " & j
    c = M / N
    MsgBox "c = " & c
    d = M / N
    MsgBox "d = " & d
    MsgBox "M / N = " & M / N
    Dim A As Integer
    Dim B As Integer
    A = 347
    B = 17
    MsgBox "A /B = " & A / B
End Sub