26

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

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

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

这让我返回“3”。

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

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

4

8 回答 8

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)
于 2010-04-02T15:32:30.893 回答
5

我这样做

WHERE abs(value - 12.75)<0.001

但我同意,任何语言都可以比较浮点相等,如果存储的值等于您插入的确切数字值,则应该没有任何问题

只有几个小数和完全匹配的值,精度错误听起来不像是 MySQL 中这种不匹配的明显原因

于 2017-04-07T07:02:20.307 回答
2

我曾经遇到过类似的问题。将“浮点”字段转换为“十进制”。它肯定会解决问题。

于 2010-04-05T07:16:43.327 回答
1

比较浮点数是否相等存在问题。这可能会产生意想不到的结果。这是由于浮点运算的内部实现。

于 2010-04-02T15:27:11.793 回答
0

这是一个浮点数,那有什么问题呢?3 可能是正确的结果,取决于数据库对 12.75 的看法。是 12.75 还是更多?

如果您想要精确的数字,请使用 DECIMAL。

于 2010-04-02T15:26:55.180 回答
0

将数字与字符串进行比较?

于 2010-04-02T15:28:30.120 回答
0

使用 REAL 而不是 FLOAT 或 DECIMAL。

于 2019-06-26T12:01:39.750 回答
0

十进制比较不适用于FLOAT数据类型值。您只需要将列数据类型更改为DECIMAL.

ALTER TABLE a MODIFY num DECIMAL(6,2);
于 2020-11-06T17:32:00.360 回答