2011-05-26 54 views
5

这可能是一个容易的,但我无法得到答案。 我需要从表mysql浮点数据没有选择在哪里条款

例如表中选择浮点值: -

value 
10.2 
4.5 
4.6 
4.06 

我的查询

SELECT * FROM table where value = '4.6' 

返回空结果集

我怎样才能解决这个!

+0

[MySQL中选择浮动]的可能重复(http://stackoverflow.com/questions/1302243/selecting-a-float-in-mysql) – Johan 2011-05-26 08:25:07

回答

15

通常,您不应该使用浮动检查相等性(除非可能具有相同的对象)。在内部,它的表现更加精确,即使在它输出到屏幕时它没有显示给你。这个基本原则适用于一般的计算。

有几十个方案这样做的,但这里是一个简单的,这应该是有意义:

SELECT * FROM table where value BETWEEN 4.599 AND 4.601 
+0

非常有用的解决方案。值-0.5和值+ 0.5之间很酷 – 2014-03-19 14:28:33

+0

任何关于精度浮点数的想法都存储在?我正在做BETWEEN(值0.000001)和(值+ 0.000001)...是否太限制? – plong0 2015-12-31 01:54:27

+0

这个问题并不是精确的,但用数学来生成浮点数。在许多情况下,固定的epsilon(方差)很好,但是非常大(或很小)的浮点数会歪曲精度的重要性。另外,实际上微处理器之间甚至不同C编译器之间会有差异,所以没有真正的魔法/安全解决方案,特别是在像SQL这样的4GL语言中。话虽如此,如果你的数字通常在相同的范围内,你应该对上面说明的那种固定/绝对epsilon很好。 – 2016-01-06 13:39:13

4

今天,我也遇到了同样的情况,并得到解决只是使用MySQL的格式化功能,它会返回你的WHERE子句完全匹配的结果。

SELECT * FROM yourtable WHERE FORMAT(`col`,2) = FORMAT(value,2) 

说明:

FORMAT('col name',precision of floating point number) 

希望它能帮助。

+1

这有助于在批准的答案建议时无法将列类型从float更改为decimal。 – 2017-08-30 12:55:47

-3

你写:

SELECT * FROM table where round(value, 1) = 4.6