Проверить равенство в поле MySQL Float
У меня есть система Joomla, и я пытаюсь изменить поиск, чтобы он правильно находил значения с плавающей запятой в базе данных.
Итак, у меня есть запрос, который создается во время выполнения, который выглядит примерно так:
select 'column1'
from 'some_table'
where 'some_float_field' <=> '2.18'
Это не работает, оно никогда не совпадает ни с чем, хотя я вижу записи в db с этим значением.
Поэтому я попытался сделать это вместо этого:
select 'column1'
from 'some_table'
where 'some_float_field' <=> 2.18
Не повезло, поэтому я попробовал кастинг десятичной (плавать не работает по какой-то причине), поэтому я попробовал это:
select 'column1'
from 'some_table'
where 'some_float_field' <=> CAST('2.18' AS DECIMAL(20, 2))
Нет кубиков...
Имейте в виду, что >= или <= возвращает правильные результаты, просто <= > дает мне проблемы.
Как я получу равенство для работы здесь?
Ответы
Ответ 1
Обычно с этими типами вопросов полезно предоставить небольшой пример для репликации ваших результатов.
Обычно тестирование для точных значений с плавающей точкой является плохой идеей, поскольку точность с плавающей точкой не является точной наукой. Гораздо лучше использовать некоторый допуск.
create table foo1 (col1 float);
insert into foo1 values (2.18);
select * from foo1 where abs(col1-2.18) <= 1e-6
Ответ 2
Я нашел способ проверить, что мои пользователи рассматривают как равенство.
Мне пришлось преобразовать поле в строку символов и проверить наборы символов, поэтому это отлично подходит для них:
select 'column1'
from 'some_table'
where CAST('some_float_field' AS CHAR) <=> '2.18'
Ответ 3
Рассмотрим это:
where abs(some_float_field) - 2.18 < 0.001
Ответ 4
Я знаю, что это старый пост, но если вы не хотите, чтобы точное сравнение использовало LIKE или NOT LIKE:
select 'column1'
from 'some_table'
where 'some_float_field' NOT LIKE '2.18'