Что-то я не могу понять почему это неправильно работает.
Private Sub Form_Load()
Dim q1 As Double
Dim q2 As Double
Dim s1, s2 As String
Dim q3 As Double
s1 = "1.1212"
s2 = "1.1210"
q1 = s1
q2 = s2
q3 = q1 - q2
MsgBox q3
End Sub
На выходе q3=1.99999999999978E-04, а не 0,0002, почему так происходит и как от этого избавиться? Пока просто округляю до нужного знака.
"Igore" <25308@users.rsdn.ru> schrieb im Newsbeitrag news:1154608@news.rsdn.ru... > Что-то я не могу понять почему это неправильно работает. > >
> Private Sub Form_Load()
> Dim q1 As Double
> Dim q2 As Double
> Dim s1, s2 As String
> Dim q3 As Double
> s1 = "1.1212"
> s2 = "1.1210"
> q1 = s1
> q2 = s2
> q3 = q1 - q2
> MsgBox q3
> End Sub
>
> На выходе q3=1.99999999999978E-04, а не 0,0002, почему так происходит и как от этого избавиться? Пока просто округляю до нужного знака.
Из-за ограниченной разрядной сетки процессора могут быть такие "неточности" при преобразовании из двоичного в десятичное представление (и наоборот). Нади либо брать целочисленные числа, либо округлять.
Здравствуйте, Peter Fleischer, Вы писали:
PF>Из-за ограниченной разрядной сетки процессора могут быть такие "неточности" при преобразовании из двоичного в десятичное представление (и наоборот). Нади либо брать целочисленные числа, либо округлять.
PF>Peter
Как выеснилось ошибка еще проще, мне просто интересно, это у меня одного такое или нет.
Dim q3 As Double
q3 = 1.1212 - 1.1211
MsgBox q3 'q3<>0.0001
... > Как выеснилось ошибка еще проще, мне просто интересно, это у меня одного такое или нет.
> Dim q3 As Double
> q3 = 1.1212 - 1.1211
> MsgBox q3 'q3<>0.0001
Это у всех процессоров X86 так. Если хочешь точно, то примени соответствующие типы, напр. так:
[vb]
Dim q3 As Double
q3 = CDec(1.1212) - CDec(1.1211)
MsgBox q3 'q3=0.0001
PF>Это у всех процессоров X86 так. Если хочешь точно, то примени соответствующие типы, напр. так:
PF>
PF> Dim q3 As Double
PF> q3 = CDec(1.1212) - CDec(1.1211)
PF> MsgBox q3 'q3=0.0001
PF>
Спасибо так красивее, но почему во всех других языках которые я знаю, результат правильный. При делении ошибки могут накапливаться это ясно, но откуда возникаю ошибки прм таком простом вычитании
Hello, Igore!
PF>> Это у всех процессоров X86 так. Если хочешь точно, то примени
I> Спасибо так красивее, но почему во всех других языках которые я знаю, I> результат правильный. При делении ошибки могут накапливаться это ясно, I> но откуда возникаю ошибки прм таком простом вычитании
Дабл устроен так что физически не может хранить число 0.2 точно, так как получается бесконечная периодическая двоичная дробь.
То есть ошибка получается уже при присваивании doubleVar = 0.2 От используемого языка не зависит, что подтверждается массой подобных вопросов и в конфе С++ и NET и остальных наверно тоже .
Здравствуйте, Igore, Вы писали:
I>Что-то я не могу понять почему это неправильно работает.
... I>На выходе q3=1.99999999999978E-04, а не 0,0002, почему так происходит и как от этого избавиться? Пока просто округляю до нужного знака.
Всё правильно — это же числа с плавающей точкой.
Если нужны числа с фиксированой запятой, то можно глянуть на decimal.
Так получишь 0,0002:
Dim q1
Dim q2
Dim s1, s2 As String
Dim q3
s1 = "1.1212"
s2 = "1.1210"
q1 = CDec(s1)
q2 = CDec(s2)
q3 = q1 - q2
MsgBox q3