Проверьте на равенство в поле MySQL Float - PullRequest
15 голосов
/ 03 февраля 2010

У меня есть система Joomla, и я пытаюсь изменить поиск, чтобы он правильно находил значения с плавающей запятой в базе данных.

Итак, у меня есть запрос, который создается во время выполнения и выглядит примерно так:

select 'column1'
from 'some_table'
where 'some_float_field' <=> '2.18'

Это не работает, оно никогда ничего не совпадает, хотя я вижу записи в БД с этим значением.

Поэтому я попытался сделать это вместо этого:

select 'column1'
from 'some_table'
where 'some_float_field' <=> 2.18

Не повезло, поэтому я попытался привести к десятичному типу (float по какой-то причине не работает), поэтому я попробовал это:

select 'column1'
from 'some_table'
where 'some_float_field' <=> CAST('2.18' AS DECIMAL(20, 2))

Без кубиков ...

Имейте в виду, что> = или <= возвращает правильные результаты, просто <=> вызывает у меня проблемы.

Как мне получить равенство, чтобы работать здесь?

Ответы [ 5 ]

15 голосов
/ 03 февраля 2010

Обычно с такими типами вопросов полезно привести небольшой пример для воспроизведения ваших результатов.

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

create table foo1 (col1 float);

insert into foo1 values (2.18);
select * from foo1 where abs(col1-2.18) <= 1e-6
4 голосов
/ 03 февраля 2010

Я нашел способ проверить то, что мои пользователи считают равенством.

Мне пришлось преобразовать поле в строку символов и проверить наборы символов, так что для них это прекрасно работает:

select 'column1'
from 'some_table'
where CAST('some_float_field' AS CHAR) <=> '2.18'
2 голосов
/ 12 июля 2018

Вот простой способ сделать это

Просто напишите where some_float_field LIKE 2.18

Надеюсь, это поможет;)

2 голосов
/ 03 февраля 2010

Учтите это:

where abs(some_float_field) - 2.18 < 0.001
0 голосов
/ 16 декабря 2014

Я знаю, что это старый пост, но если вы не хотите точного сравнения, просто используйте LIKE или NOT LIKE:

select 'column1'
from 'some_table'
where 'some_float_field' NOT LIKE '2.18'
...