Подтвердить что ты не робот

Выбор поплавка в MySQL

Я пытаюсь выполнить соответствие SELECT в таблице на основе идентификатора и цены, например:

SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31';

Приведенное выше возвращает нулевые строки, а если вы удалите бит price='101.31', он вернет правильную строку.

Выполнение...

SELECT * FROM `table`;

Возвращает ту же строку, что и выше, и совершенно четко заявляет, что price='101.31'. Однако выбор не подходит. Изменение = на <= заставляет его работать, но это не совсем решение.

Есть ли способ отбросить MySQL-float до 2-х цифр до того, как операция будет выполнена на нем, тем самым сделав описанную выше работу SELECT (или какое-то другое решение)?

Спасибо!

4b9b3361

Ответ 1

Для меня работало деление на число:

SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL);

Однако вам может потребоваться просто сделать столбец price DECIMAL в первую очередь. DECIMAL обычно считается лучшим типом для использования при работе с денежными значениями.

Ответ 2

Это не работает, потому что поплавок по своей сути является неточным. Фактическое значение, вероятно, похоже на "101.3100000000001". Сначала вы можете использовать ROUND() для округления до 2-х мест или лучше использовать тип DECIMAL вместо float.

Ответ 3

Никогда не используйте поплавки за деньги.

Ответ 4

Сегодня я также столкнулся с одной и той же ситуацией и разрешаюсь с помощью функции FORMAT MySQL, она вернет результаты, которые точно соответствуют вашему предложению WHERE.

SELECT * FROM yourtable WHERE FORMAT (col, 2) = FORMAT (значение, 2)

Объяснение: FORMAT ('col name', точность числа с плавающей запятой)

Надеюсь, что это поможет.

Ответ 5

Возможно, что-то вроде этого:

SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01;

Ответ 6

Это работает?

SELECT * , ROUND( price, 2 ) rounded
FROM table
WHERE ident = 'ident23'
HAVING rounded = 101.31