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中文网其他相关文章!

本文讨论了使用MySQL的Alter Table语句修改表,包括添加/删除列,重命名表/列以及更改列数据类型。

文章讨论了为MySQL配置SSL/TLS加密,包括证书生成和验证。主要问题是使用自签名证书的安全含义。[角色计数:159]

文章讨论了流行的MySQL GUI工具,例如MySQL Workbench和PhpMyAdmin,比较了它们对初学者和高级用户的功能和适合性。[159个字符]

本文讨论了使用Drop Table语句在MySQL中放下表,并强调了预防措施和风险。它强调,没有备份,该动作是不可逆转的,详细介绍了恢复方法和潜在的生产环境危害。

本文讨论了在PostgreSQL,MySQL和MongoDB等各个数据库中的JSON列上创建索引,以增强查询性能。它解释了索引特定的JSON路径的语法和好处,并列出了支持的数据库系统。

文章讨论了使用准备好的语句,输入验证和强密码策略确保针对SQL注入和蛮力攻击的MySQL。(159个字符)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3汉化版
中文版,非常好用

WebStorm Mac版
好用的JavaScript开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版