通过在MySQL数据库模式中引入浮点列,我遇到了一个问题,即对浮点值的比较并不总是返回正确的结果。
1- 50.12
2- 34.57
3- 12.75
4-...(其余均小于12.00)
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
这将返回"3“。
我读到过在MySQL中比较浮点值是一个坏主意,而decimal类型是更好的选择。
我是否有希望继续使用float类型,并让比较正确地工作?
发布于 2010-04-02 23:32:31
你注意到下面的问题了吗?
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)
发布于 2017-04-07 15:02:20
我这样做
WHERE abs(value - 12.75)<0.001
但我同意,任何语言都可以比较浮点数相等,如果存储值等于您插入的精确数值,应该不会有任何问题
由于只有几个小数和精确匹配值,精度错误听起来不像是MySQL中出现这种不匹配的明显原因
发布于 2010-04-05 15:16:43
我曾经遇到过类似的问题。将“float”字段转换为“decimal”。这肯定会解决这个问题。
https://stackoverflow.com/questions/2567434
复制相似问题