我在MySQL数据库架构中引入浮点列时遇到了一个问题,即对浮点值的比较不会总是返回正确的结果。
1-50.12 2-34.57 3-12.75 4-…(其余均小于12.00)
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
这将返回“ 3”。
我已经读过,在MySQL中比较浮点值是一个坏主意,十进制类型是更好的选择。
我是否有希望继续使用float类型,并使比较正常工作?
您是否注意到以下问题?
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。
0.00000005722
为避免浮点算术和比较出现问题,应使用DECIMAL数据类型:
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)