我有:
SELECT x(point), y(point) WHERE x(point) = 3.69334468807005
x和y的类型为双精度。
我看到这个值确实存在于表中,但是在PostgreSQL中运行查询并不会返回任何内容。为什么会出现这种情况?可能是由于精度问题?
谢谢!
答案 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
我要看的另一件事是在过滤数据时可能会使用其他形式的密钥。您的表格是否具有某种可以使用的自然键,或者只是添加一个自动递增的字段以使用主键?
我还看到当涉及函数时索引表现不佳。这张桌子上有没有索引?