Я пытаюсь выполнить соответствие SELECT
в таблице на основе идентификатора и цены, например:
SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31';
Приведенное выше возвращает нулевые строки, а если вы удалите бит price='101.31'
он вернет правильную строку.
Выполнение …
SELECT * FROM `table`;
Возвращает ту же строку, что и выше, и совершенно ясно указывает, что price='101.31'
. Однако выбор не подходит. Изменение =
на <=
заставляет его работать, но это не совсем решение.
Есть ли способ отбросить MySQL-float до 2-х цифр до того, как операция будет выполнена на нем, тем самым сделав вышеуказанную работу SELECT
(или какое-то другое решение)?
Благодаря!
Кастинг для десятичной дроби для меня работал:
SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL);
Тем не менее, вы можете подумать о том, чтобы просто сделать столбец price
DECIMAL в первую очередь. DECIMAL обычно считается лучшим типом для использования при работе с денежными величинами.
Это не работает, потому что поплавок по своей сути является неточным. Фактическое значение, вероятно, похоже на «101.3100000000001». Сначала вы можете использовать ROUND () для округления до 2-х мест или лучше использовать тип DECIMAL вместо float.
Никогда не используйте поплавки за деньги.
Сегодня я также столкнулся с той же ситуацией и решаюсь с помощью функции FORMAT MySQL, она вернет результаты, которые точно соответствуют вашему предложению WHERE.
SELECT * FROM yourtable WHERE FORMAT (col, 2) = FORMAT (значение, 2)
Объяснение: FORMAT ('col name', точность числа с плавающей запятой)
Надеюсь, поможет.
Возможно, что-то вроде этого:
SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01;
Это работает?
SELECT * , ROUND( price, 2 ) rounded FROM table WHERE ident = 'ident23' HAVING rounded = 101.31