PostgreSQL查询返回零行,具有双精度字段/函数

时间:2011-12-17 23:24:16

标签: postgresql

我有:

SELECT x(point), y(point) WHERE x(point) = 3.69334468807005

x和y的类型为双精度。

我看到这个值确实存在于表中,但是在PostgreSQL中运行查询并不会返回任何内容。为什么会出现这种情况?可能是由于精度问题?

谢谢!

2 个答案:

答案 0 :(得分:3)

旧学校回答:“不要仅仅为了平等而比较浮点数。” (编程风格的元素,Kernighan和Plauger,1978)

为什么呢?因为比较两个浮点数的平等性总是在某些情况下有效,但在几乎不同的情况下它几乎不会起作用。这是由于浮点数的性质,而不是程序员的技能。

浮点数学的规范文章是What Every Computer Scientist Should Know About Floating-Point Arithmetic

在您的情况下,您可以调整the relative difference function from this C language FAQ。 (向下滚动,查找RelDif()。)

答案 1 :(得分:2)

您当然可以测试它是否是精度问题,只需将语句的WHERE子句扩展为范围,并收紧该范围(通过添加更多精度),直到您拥有记录或确认它与精度相关:

SELECT x(point), y(point)
WHERE x(point) > 3.69
  AND x(point) < 3.70

我要看的另一件事是在过滤数据时可能会使用其他形式的密钥。您的表格是否具有某种可以使用的自然键,或者只是添加一个自动递增的字段以使用主键?

我还看到当涉及函数时索引表现不佳。这张桌子上有没有索引?