MySQL浮点比较问题

标签 mysql comparison floating-point select-query

我在 MySQL 数据库模式中引入浮点列时遇到了一个问题,浮点值的比较并不总是返回正确的结果。

1 - 50.12
2 - 34.57
3 - 12.75
4 - ...(其余均小于 12.00)

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

这会返回“3”。

我读到在 MySQL 中比较浮点值是个坏主意,十进制类型是更好的选择。

我是否有希望继续使用 float 类型并使比较正常工作?

最佳答案

你注意到下面的问题了吗?

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)

关于MySQL浮点比较问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2567434/

相关文章:

sql-server - 如果我选择 RavenDB,我会失去 SQL Server 的哪些优势?

java - 加减精确值以 float

java - Java中的计算问题

php - 通过JSON、Jquery和PHP动态显示MYSQL表数据

mysql - 从触发器读取和写入自动增量值

c# - 如何比较人物(尊重文化)

python - 得到除法后的所有小数位

MySQL显示重复行

php - 直接使用 PDO 类是否更安全?

MySQL 与 Count 的比较