Проблемы сравнения плавающей точки MySQL

Я столкнулся с проблемой путем представления столбцов с плавающей точкой в схеме базы данных MySQL, что сравнения на значениях с плавающей точкой всегда не возвращают корректные результаты.

1 - 50.12
2 - 34.57
3 - 12.75
4-... (оставьте все меньше чем 12,00),

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"

Это возвращает меня "3".

Я считал, что сравнения значений с плавающей точкой в MySQL являются плохой идеей, и десятичный тип является более оптимальным вариантом.

Я имею какую-либо надежду на продвижение вперед с типом плавающим и заставляю сравнения работать правильно?

20
задан mauris 2 April 2010 в 15:24
поделиться

5 ответов

Вы заметили проблему ниже?

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)
25
ответ дан 30 November 2019 в 00:31
поделиться

Это числа с плавающей точкой, в чем проблема? 3 может быть правильным результатом, зависит от того, что думает база данных о 12,75. Это 12,75 или чуть больше?

Используйте DECIMAL, если вам нужны точные числа.

1
ответ дан 30 November 2019 в 00:31
поделиться

Сравнение числа со строкой?

0
ответ дан 30 November 2019 в 00:31
поделиться

Существует проблема со сравнением плавающих значений на равенство. Это может дать непредсказуемые результаты. Это связано с внутренней реализацией арифметики с плавающей запятой.

1
ответ дан 30 November 2019 в 00:31
поделиться

I однажды столкнулся с подобной проблемой. Преобразуйте поле float в десятичное. Это обязательно решит проблему.

2
ответ дан 30 November 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: