Страница: 1 | 2 |
Вопрос: Про математику... 0,5 - 0,4 не равно 0,1 ???
Добавлено: 11.06.11 21:50
Автор вопроса: DimBi
Как правильно выполнять математические вычисления?
У меня получается, что:
0,5 - 0,4 = 0,099999999999999978
проверял кодом:
Dim y As Double = 0.4
Dim z As Double
z = x - y
If z = 0.1 Then
Lbresult.Text = "равно"
Else
Lbresult.Text = "Не равно"
End If
Почему так получается? Что надо сделать?
Ответы
Всего ответов: 18
Номер ответа: 1
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #1
Добавлено: 11.06.11 22:22
самое простое. Сделай "im z As Single"
Номер ответа: 2
Автор ответа:
DimBi
Вопросов: 15
Ответов: 55
Профиль | | #2
Добавлено: 11.06.11 22:33
к сожалению
Решил так:
(количество знаков после запятой на результат не влияет, просто округляет 0,09999.... к 0,1)
но, хотелось бы понять, почему так происходит?
Номер ответа: 3
Автор ответа:
FedX
ICQ: 578776900
Вопросов: 4
Ответов: 10
Профиль | | #3
Добавлено: 11.06.11 22:46
А можно еще вот так:
Номер ответа: 4
Автор ответа:
Ким Чен Ир
Вопросов: 0
Ответов: 140
Профиль | | #4
Добавлено: 11.06.11 22:52
Корень проблемы в стандарте IEEE-754, определяющем формат чисел с плавающей точкой.
Типы Double и Single его придерживаются и получают за это, что причитается.
Номер ответа: 5
Автор ответа:
DimBi
Вопросов: 15
Ответов: 55
Профиль | | #5
Добавлено: 11.06.11 23:32
И так не получится....
Номер ответа: 6
Автор ответа:
DimBi
Вопросов: 15
Ответов: 55
Профиль | | #6
Добавлено: 11.06.11 23:36
как же решается проблема?
Неужели пересчитывать каждое действие на этапе разработки?!
Может, какие правила есть?
Номер ответа: 7
Автор ответа:
Ким Чен Ир
Вопросов: 0
Ответов: 140
Профиль | | #7
Добавлено: 11.06.11 23:41
Ну почему же, ты сам ведь понял, что нужно правильное округление и контроль значимых разрядов
Номер ответа: 8
Автор ответа:
Ким Чен Ир
Вопросов: 0
Ответов: 140
Профиль | | #8
Добавлено: 11.06.11 23:50
Кроме того, есть тип Decimal.
Номер ответа: 9
Автор ответа:
DimBi
Вопросов: 15
Ответов: 55
Профиль | | #9
Добавлено: 11.06.11 23:58
Вот что нашел про этот стандарт:
всю статью можно почитать здесь: http://www.vbstreets.ru/VB/Articles/66541.aspx
Номер ответа: 10
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #10
Добавлено: 12.06.11 01:00
Стоить отметить, что в VB6 числа с плавающей точкой вычисляются нормально.
Номер ответа: 11
Автор ответа:
Ким Чен Ир
Вопросов: 0
Ответов: 140
Профиль | | #11
Добавлено: 12.06.11 01:24
Ну, достаточно ведь одного примера, чтобы опровергнуть.
Номер ответа: 12
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #12
Добавлено: 12.06.11 03:20
Да, одного хватает...
Номер ответа: 13
Автор ответа:
Ким Чен Ир
Вопросов: 0
Ответов: 140
Профиль | | #13
Добавлено: 12.06.11 03:42
Не ты ли говорил :
А теперь решил раздвинуть границы?
Есть такое понятие "фальсифициуемая теория". Можешь приводить сотню подтверждений, но достаточно одного опровержения.
Мне время тратить или сам поищешь?
Номер ответа: 14
Автор ответа:
Ким Чен Ир
Вопросов: 0
Ответов: 140
Профиль | | #14
Добавлено: 12.06.11 05:23
|A|W|P| обиделся наверно. Извини.
Хоть числа представленные операндами a и b условно "большие", они и рядом не стоят с предельно допустимыми для double +/–1.7E308.
А результат тем более ...
И это просто вычитание. А что будет при умножении/делении, да с итерациями...
Номер ответа: 15
Автор ответа:
DimBi
Вопросов: 15
Ответов: 55
Профиль | | #15
Добавлено: 12.06.11 10:46
вчера сервер перестал отвечать....
теперь видимо без костылей никак:
или, если Decimal: