簡體   English   中英

計算兩個坐標之間的距離

[英]Calculate distance between two coordinate

Coordinate 1 : 44.000, 61.001
Coordinate 2 : 44.000, 61.001

這里的坐標是相同的,所以我希望它會返回零距離。 但是他們使用下面提到的計算公式返回距離以下。

Distance between two coordinates : 8.35023072909283E-8 (Means 0.0000000835023072909283)

Coordinate 1 : 110.000, 89.001
Coordinate 2 : 110.000, 89.001

這里的坐標是相同的,所以我希望它會返回zero 但是他們使用下面提到的計算公式返回距離以下。

Distance between two coordinates : 1.5033016609322658E-7 (Means 0.00000015033016609322658)

為了計算距離,我使用了以下代碼:

Math.sqrt(Math.pow(coordinate2.getX() - coordinate1.getX(), 2) + Math.pow(coordinate2.getY() - coordinate1.getY(), 2))

為什么上面的公式返回1.5033016609322658E-7的距離類型而不是zero

注意:所有坐標值均為雙精度。

看起來您正在將坐標值四舍五入到小數點后三位。 實際存儲的坐標是一樣的,這是由於在您用於計算它們的任何數學運算中都有一些微小的累積浮點不精確度。 由於在顯示時未四舍五入,因此可以看到差異。

PS為使代碼簡潔,應將距離計算包裝到Coordinate類的方法中。 Math.hypot也很有用:

public double distance(Coordinate c) {
    return Math.hypot(x - c.x, y - c.y);
}

我建議使用int 例如44.001將變為44001,即代表小數,因此沒有小數部分。 使用公式計算距離並表示ans。 通過乘以10的合適乘方,例如10 ^ [-3]

這將避免與float相關的錯誤。

注意。 如果整數表示會創建非常大的數字,請考慮使用Java BigInteger類。

避免BigDecimal一種方法是使用整數表示。

如果您的小數永遠不會超過第3個小數位數,則可以通過乘以1000將坐標轉換為整數表示形式。這樣,您的計算就不會失去精度。

返回任何值之前,您需要將其重新轉換為正確的單位。 此邏輯應封裝在您的Coordinate類中。

兩件事:1.如前所述,最好使用BigDecimal來計算距離。 2.計算坐標之間的距離時,必須考慮到它們在一個球面上,而不是在一個平面上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM