2017-10-18 235 views
1

我正在測試PostGIS空間數據庫中的函數:ST_DWithin。在邊緣情況下,我有時會得到true,有時會得到falsePostGIS的ST_D結果精度

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 

不應同時無論是真的還是假的?有人可以向我解釋結果嗎?

回答

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 DOC PostgreSQL的和google 浮點比較