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?