2010-02-02 83 views
12

我有一个Joomla系统,我试图改变搜索,以便它正确地找到数据库中的浮点值。检查MySQL Float字段上的相等性

所以,我在运行时建立一个查询,看起来像这样:

select 'column1' 
from 'some_table' 
where 'some_float_field' <=> '2.18' 

这是不行的,它永远不会匹配任何东西,即使我看到的记录在数据库中该值那里。

于是,我就只是这样做,而不是:

select 'column1' 
from 'some_table' 
where 'some_float_field' <=> 2.18 

没有运气,所以后来我试图强制转换为十进制(浮动不会出于某种原因),所以我想这:

select 'column1' 
from 'some_table' 
where 'some_float_field' <=> CAST('2.18' AS DECIMAL(20, 2)) 

没有骰子...

请记住,> =或< =返回正确的结果,只是< =>给我的问题。

我该如何在这里工作?

回答

12

这是很好的提供了一个小例子来复制你的结果。

通常测试精确的浮点值是一个坏主意,因为浮点精度不是一门精确的科学。使用一些容差要好得多。

create table foo1 (col1 float); 

insert into foo1 values (2.18); 
select * from foo1 where abs(col1-2.18) <= 1e-6 
+0

是的,在这种情况下,我实际上是在试图找到用户所投入东西的“重量”,但他们想要匹配确切的数字,所以我必须满足要求。 – Joseph 2010-02-02 22:28:24

+2

用户需要在表中使用浮点数据类型吗?通常,当用户想要精确的分数(例如货币)时,十进制数据类型是更好的选择。未来几年你会遇到四舍五入的问题。想想看。如果它真的是金钱,无论如何,不​​要浪费时间,重新设计现在的小数点。相信我,我从这里讲述经验。 – 2010-02-03 02:05:59

+0

我同意塞瓦。在开始处理新数据库之前,我要做的第一件事是运行以下查询并查找使用了多少浮点数列。 SELECT DATA_TYPE,COUNT(*)AS mycount FROM information_schema.COLUMNS WHERE TABLE_SCHEMA NOT IN('information_schema','mysql')GROUP BY DATA_TYPE ORDER BY mycount DESC 如果我发现double,float,bigint和blob的数目是太高,我认为会有很多问题。 如果十进制数,日期,日期时间,tinyint太小(或不足),那么再次出现问题:) – shantanuo 2010-02-03 06:42:44

1

考虑一下:通常与这些类型的问题

where abs(some_float_field) - 2.18 < 0.001 
+0

我理解精度问题。在我的情况下,我不关心精度超过小数点后第二位。我只是想找到任何匹配的东西,我不想做任何算术。 – Joseph 2010-02-02 22:24:35

4

我找到了一种方法来检查我的用户视为平等。

我只好到外地转换为字符串并测试字符集,所以此工程罚款对他们来说:

select 'column1' 
from 'some_table' 
where CAST('some_float_field' AS CHAR) <=> '2.18' 
0

我知道这是一个老的文章,但如果你不想精确对比只是使用LIKE或不喜欢:

select 'column1' 
from 'some_table' 
where 'some_float_field' NOT LIKE '2.18' 
+0

这是一个字符串比较!它还返回像'12.18'等行。 – xmedeko 2017-10-12 06:34:54

+0

@xmedeko作者要求找到一种方法来获取所有值不等于2.18。即使它是一个字符串比较12.18不等于2.18,所以返回12.18没有问题。另外,如果您仔细查看我的查询,您会注意到我没有使用百分号,因此12.18是一个正确的返回值。 – Shaolin 2017-10-13 07:41:26

+0

@xmedeko没有什么可编辑的。如果你只想要浮点数等于2.18,那么就使用不带%符号的LIKE,它将只检索2.18。 (2.18),(12.18),(32.18); SELECT * FROM test where price LIKE'2.18';' – Shaolin 2017-10-16 08:50:32