我有:
SELECT x(point), y(point) WHERE x(point) = 3.69334468807005
Run Code Online (Sandbox Code Playgroud)
x和y是双精度类型.
我看到这个值确实存在于表中,但是在PostgreSQL中运行查询并不会返回任何内容.为什么会出现这种情况?也许是由于精度问题?
谢谢!
当处理浮点数(单精度或双精度)时,在99%的情况下进行精确比较是徒劳的.这不仅适用于PostgreSQL,也适用于使用FP算法的所有计算机语言.
三个原因是,double的内部表示可以包含比显示更多的数字,同时许多数字不能使用FP精确表示(0.1是经常被引用的示例),因此所有"显示"值都是被截断为人类可以理解的东西(即没有像"0.099999999999999999999999999"而不是"0.1").
因此,一旦计算了要比较的数字之一(舍入误差)或已经从字符串转换,就必须避免直接比较.相反,必须承认一些"范围"
where x between 3.69334468807004 and 3.69334468807006 -- note the different numbers
Run Code Online (Sandbox Code Playgroud)
直接比较的唯一有效情况是先前已复制值的情况.一个虚构的例子是:
SELECT x, y, f1(x,y), f2(x,y), ... INTO TEMP temp_xy FROM points;
SELECT * FROM points p JOIN temp_xy t on p.x = t.x and p.y = t.y;
Run Code Online (Sandbox Code Playgroud)
x和y刚刚被复制,因此它们可以用作连接标准.
编辑这是一个很好的启动器,本文还介绍了浮点数的一些非直观问题.
| 归档时间: |
|
| 查看次数: |
1909 次 |
| 最近记录: |