Проблема с фильтрацией полей типа Float в ADO Recordset

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
yu13
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 17.06.2005 (Пт) 13:40

Проблема с фильтрацией полей типа Float в ADO Recordset

Сообщение yu13 » 30.05.2006 (Вт) 20:28

Задача следующая: требуется наложить фильтр на RS:

Код: Выделить всё
  RS.Filter="F1=0,981344909442318"


где F1 - столбец типа Float (15 знач. цифр). Среди значений этого столбца искомое значение существует. Тем не менее в результате фильтрации в RS не оказывается ни одной строки (записи). Однако, если я задаю фильтр

Код: Выделить всё
  RS.Filter="F1>=0,981344909442318 and F1<=0,981344909442319"


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

Я конечно понимаю, хотя не совсем одобряю правило "<120", но на форуме для новичков мне вряд ли кто ответит на этот вопрос. Поэтому большая просьба к модераторам перенести вопрос на 1 шаг повыше, тем более, что сам я уже лет 9 не новичок. Спасибо за внимание.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 30.05.2006 (Вт) 20:55

Не очень удачная идея проверять вещественное число на равенство. Обычно сравнивают:
Код: Выделить всё
e<=ABS(f1-f2)

где e - допустимая погрешность; f1, f2 - вещественные числа.
Поэтому, я думаю, вариант с интервалом более правильный.

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.05.2006 (Вт) 21:41

В БД не рекомендуется использовать типы с плавающей запятой без особых причин. Особыми причинами является та ситуация, когда значения не будут сравниваться с другими значениями на равенство, но могут принимать широкий спектр значений.
Поэтому лучше переведи на числа с фиксированной запятой. Если это невозможно, то храни числа в строке. Если и это невозможно, то сравнивай, как сказал VVitafresh, с допустимой погрешностью.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing-бот и гости: 99

    TopList