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