Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Третий день сижу и туплю. Проблема такая.
Есть три колонки с типом данных FLOAT - pcd2, dia и diametr. Они имеют, к примеру, следующие значения: pcd2 - 98, 100, 114.3, dia - 57.01 , 58, 59.5, diametr - 13, 14, 17.5 .
Запрос типа SELECT pcd2 FROM product выводит все значения, также и в остальных колонках. Запрос SELECT * FROM product WHERE pcd2 = 98 срабатывает как положено, то есть когда я выбираю целые числа запрос такого вида работает нормально. Но если я пишу запрос типа SELECT * FROM product WHERE pcd2=114.3 , то есть с дробным значением запрос не находит ничего, хотя такие товары есть. Такая же ситуация и в колонке dia, а в третьей колонке все работает нормально.
Подскажите пожалуйста что это может обозначать и в какую сторону мне вообще копать то.
Заранее благодарен.
Неактивен
Дробные значения напрямую (через = ) сравнивать нельзя, из-за двоичной арифметики идут погрешности и округления. Установите тип decimal вместо float.
Ну или сравнивайте не a == b,
а
abs(a-b) < epsilon
Неактивен
Да действительно. Огромное спасибо. С DECIMAL работает. Непонятно только почему в другой колонке работает FLOAT.
Еще раз спасибо.
Неактивен
Повезло просто, вот и работает. не делайте так ).
Неактивен
Мы все параметры дисков переводим в целые числа умножая на 100. Вами указанные параметры дальше сотых никогда не идут, поэтому умножения на 100 достаточно.
А потом уже делаем выборку целыми числами.
Т.е. вместо = 98 получается 9800, вместо 114,3 - 11430. В результате и фильтры по параметрам работают быстрее и нет головных болей с DECIMAL и FLOAT.
Неактивен