Проверить равенство в поле 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'