为什么 MySQL 浮点比较不准确?

Susan Sarandon
发布: 2024-11-07 12:12:02
原创
456 人浏览过

Why Are MySQL Floating-Point Comparisons Inaccurate?

MySQL 浮点比较缺陷

虽然将浮点列引入 MySQL 数据库模式被证明是有用的,但涉及浮点值的比较有时会产生结果不可靠的结果。

演示:

考虑一个包含以下值的点列的表:

1 - 50.12
2 - 34.57
3 - 12.75
4 - ...(all other values are less than 12.00)
登录后复制

执行查询:

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
登录后复制

意外返回“3”。

众所周知,MySQL 浮点值比较容易出现不一致,而十进制数据类型是这种比较的更好选择。

您可以继续使用浮点类型吗?

虽然通常建议使用 DECIMAL 数据类型进行精确浮点比较,但如果您知道的话,您仍然可以继续使用浮点类型它的潜在陷阱。其中一个陷阱是计算过程中可能会出现轻微的精度损失。

例如,让我们考虑下表:

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;
登录后复制

产生结果:

159.94000005722
登录后复制

注意意外的“0.00000005722”。此类舍入错误可能会导致比较差异。

要缓解此类问题,您可以将浮点列转换为具有指定精度和小数位数的 DECIMAL 数据类型。例如:

ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
登录后复制

结果现在变为:

159.94
登录后复制

通过使用 DECIMAL 数据类型,可以确保准确的比较并避免与 MySQL 中的浮点值相关的精度问题.

以上是为什么 MySQL 浮点比较不准确?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板