Я столкнулся с проблемой путем представления столбцов с плавающей точкой в схеме базы данных MySQL, что сравнения на значениях с плавающей точкой всегда не возвращают корректные результаты.
1 - 50.12
2 - 34.57
3 - 12.75
4-... (оставьте все меньше чем 12,00),
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
Это возвращает меня "3".
Я считал, что сравнения значений с плавающей точкой в MySQL являются плохой идеей, и десятичный тип является более оптимальным вариантом.
Я имею какую-либо надежду на продвижение вперед с типом плавающим и заставляю сравнения работать правильно?
Вы заметили проблему ниже?
CREATE TABLE a (num float);
INSERT INTO a VALUES (50.12);
INSERT INTO a VALUES (34.57);
INSERT INTO a VALUES (12.75);
INSERT INTO a VALUES (11.22);
INSERT INTO a VALUES (10.46);
INSERT INTO a VALUES (9.35);
INSERT INTO a VALUES (8.55);
INSERT INTO a VALUES (7.23);
INSERT INTO a VALUES (6.53);
INSERT INTO a VALUES (5.15);
INSERT INTO a VALUES (4.01);
SELECT SUM(num) FROM a;
+-----------------+
| SUM(num) |
+-----------------+
| 159.94000005722 |
+-----------------+
Между некоторыми из этих строк есть дополнительный 0,00000005722
разброс. Поэтому некоторые из этих значений вернут false по сравнению со значением, которым они были инициализированы.
Чтобы избежать проблем с арифметикой с плавающей запятой и сравнениями, следует использовать тип данных DECIMAL
:
ALTER TABLE a MODIFY num DECIMAL(6,2);
SELECT SUM(num) FROM a;
+----------+
| SUM(num) |
+----------+
| 159.94 |
+----------+
1 row in set (0.00 sec)
Это числа с плавающей точкой, в чем проблема? 3 может быть правильным результатом, зависит от того, что думает база данных о 12,75. Это 12,75 или чуть больше?
Используйте DECIMAL, если вам нужны точные числа.
Существует проблема со сравнением плавающих значений на равенство. Это может дать непредсказуемые результаты. Это связано с внутренней реализацией арифметики с плавающей запятой.
I однажды столкнулся с подобной проблемой. Преобразуйте поле float в десятичное. Это обязательно решит проблему.