2

我有一个表sellerparams,其中包含许多列,其中一个名为probabilityinc. 此列的类型是float

我不明白为什么第二个查询没有按我的预期工作。

第一次查询和结果

mysql> select id,probabilityinc from temp.sellerparams;
+----+----------------+
| id | probabilityinc |
+----+----------------+
|  1 |            0.3 |
|  2 |            0.3 |
|  3 |            0.3 |
|  4 |            0.4 |
+----+----------------+
4 rows in set (0.01 sec)

第二次查询和结果(意外?)

mysql> select id from temp.sellerparams where probabilityinc=0.4;
Empty set (0.00 sec)

如您所见,有一排带有probabilityinc=0.4. 为什么第二个选择返回空?这是否与浮点值的内部表示有关?如果是这样,我如何根据浮点类型的列进行选择?

谢谢你。

4

2 回答 2

3

为您的列使用更准确的数据类型可能会更好,因为浮点数的精度相当有限。也就是说,在比较浮点值时始终使用容差值是一种很好的做法

select id from temp.sellerparams 
where probabilityinc between (0.4 - epsilon) AND (0.4 + epsilon); 

其中 epsilon 代表您的容差,例如 0.0001

于 2012-06-19T13:55:35.473 回答
3

您应该将列类型更改为numeric. float设计上是不准确的。像 0.4 这样的数字可能会略有不同。这就是为什么0.4如果数字存储为0.39999999

例如,您可以使用numeric(10,5)

查看文档

于 2012-06-19T13:55:36.310 回答