Выбор поплавка в 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
(или какое-то другое решение)?
Спасибо!
Ответы
Ответ 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