Выбор поплавка в MySQL - PullRequest
       17

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

24 голосов
/ 19 августа 2009

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

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

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

Делать ...

SELECT * FROM `table`;

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

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

Спасибо!

Ответы [ 8 ]

41 голосов
/ 19 августа 2009

Приведение к десятичной дроби сработало для меня:

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

Тем не менее, вы можете рассмотреть вопрос о том, чтобы сделать столбец price ДЕЙСТВИТЕЛЬНЫМ. DECIMAL, как правило, считается лучшим типом для использования при работе с денежными значениями.

11 голосов
/ 19 августа 2009

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

9 голосов
/ 19 августа 2009

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

7 голосов
/ 30 марта 2015

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

SELECT * FROM yourtable WHERE FORMAT(col,2) = FORMAT(value,2)

Объяснение: FORMAT('col name', precision of floating point number)

0 голосов
/ 27 сентября 2018

Попробуйте это: ВЫБРАТЬ * ИЗ стол ГДЕ цена как 101.31 ;

0 голосов
/ 31 января 2018

Я искал решение, но в конце концов я сделал это, используя мой предыдущий php number_format (), который пришел к решению @ hmasif.

Используйте это, и вы получите ваш поплавок - совпадение mysql:

$floatmatch = number_format((float)$yourfloatvariable,5);

, где 5 - пять строк из десятичной точки. например 7,93643

0 голосов
/ 19 августа 2009

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

SELECT * , ROUND( price, 2 ) rounded
FROM table
WHERE ident = 'ident23'
HAVING rounded = 101.31
0 голосов
/ 19 августа 2009

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

SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...