MySQL浮点比较问题
我遇到了一个问题,通过在MySQL数据库模式中引入浮点列,浮点值的比较总是不会返回正确的结果。
1 – 50.12
2 – 34.57
3 – 12.75
4 – …(全部小于12.00)
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
这返回我“3”。
我读过,MySQL中浮点值的比较是一个坏主意,小数types是更好的select。
我有没有希望继续浮动types,并获得比较正常工作?
你注意到下面的问题吗?
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
数据types:
ALTER TABLE a MODIFY num DECIMAL(6,2); SELECT SUM(num) FROM a; +----------+ | SUM(num) | +----------+ | 159.94 | +----------+ 1 row in set (0.00 sec)
我曾经遇到类似的问题。 将“浮点”字段转换为“十进制”。 这一定会解决问题。
这是一个浮点,那么问题是什么? 3可能是正确的结果,取决于数据库认为12.75。 是12.75还是更多一点?
如果您需要确切的数字,请使用DECIMAL。
花车比较平等有一个问题。 这可能会带来不可预知的结果。 这是由于浮点运算的内部实现。
我这样做
WHERE abs(value - 12.75)<0.001
但我同意,任何语言都可以比较浮动相等,如果存储的值等于您插入的确切数字值,则不应该有任何问题
只有几个小数和精确的匹配值,精度错误听起来并不是MySQL中这种不匹配的明显原因
比较一个数字和一个string?