我在PostGIS空间数据库中测试一个函数:ST_DWithin
。在边缘情况下,我有时会得到true
,有时会false
。
SELECT ST_DWithin(
ST_GeomFromText('POINT(-90.01 30)','4326'),
ST_GeomFromText('POINT(-90 30)','4326'),
'0.01'
)
st_dwithin -> false
和
SELECT ST_DWithin(
ST_GeomFromText('POINT(-90.1 30)','4326'),
ST_GeomFromText('POINT(-90 30)','4326'),
'0.1'
)
st_dwithin -> true
不应该是真还是假?有人可以向我解释结果吗?
答案 0 :(得分:1)
这是由于底层计算使用双精度而不是精确的数字类型。因此,计算出的点之间的距离最多只能达到15位数。
Select ST_Distance(ST_GeomFromText('POINT(-90.01 30)','4326'),
ST_GeomFromText('POINT(-90 30)','4326')) d1,
ST_Distance(ST_GeomFromText('POINT(-90.1 30)','4326'),
ST_GeomFromText('POINT(-90 30)','4326')) d2;
==>
d1 | d2
--------------------+--------------------
0.0100000000000051 | 0.0999999999999943
(1 row)
我们可以看到两个计算距离都不准确。而且,浮点相等比较应该始终考虑精度。如果没有完成,我们会得到意想不到的结果(如d1 > .01 and d2 < .1
)
您可以在floats和google 浮点比较
上阅读Postgresql文档