首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL浮点比较问题

MySQL浮点比较问题
EN

Stack Overflow用户
提问于 2010-04-02 23:22:29
回答 8查看 32.2K关注 0票数 25

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

1- 50.12

2- 34.57

3- 12.75

4-...(其余均小于12.00)

代码语言:javascript
复制
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"

这将返回"3“。

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-04-02 23:32:31

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

代码语言:javascript
复制
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数据类型:

代码语言:javascript
复制
ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
+----------+
| SUM(num) |
+----------+
|   159.94 | 
+----------+
1 row in set (0.00 sec)
票数 30
EN

Stack Overflow用户

发布于 2017-04-07 15:02:20

我这样做

代码语言:javascript
复制
WHERE abs(value - 12.75)<0.001

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

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

票数 4
EN

Stack Overflow用户

发布于 2010-04-05 15:16:43

我曾经遇到过类似的问题。将“float”字段转换为“decimal”。这肯定会解决这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2567434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档