為什麼我建立的公式給出的結果與 Excel 中 UDF 相同的公式給出的結果不同?

為什麼我建立的公式給出的結果與 Excel 中 UDF 相同的公式給出的結果不同?

這是一個計算地球上兩個座標點之間距離的長公式

=ACOS(COS(弧度(90-LAT1)) *COS(弧度(90-LAT2)) +SIN(弧度(90-LAT1)) *SIN(弧度(90-LAT2)) *COS(弧度(長1-長2) )))*6371

由於在其他公式中使用有點麻煩,我為此編寫了一個用戶定義的函數。

函數 DistXY(Lat1 作為單個,Lng1 作為單個,Lat2 作為單個,Lng2 作為單一) 作為單個

DistXY = WorksheetFunction.Acos(Cos(WorksheetFunction.Radians(90 - Lat1)) * Cos(WorksheetFunction.Radians(90 - Lat2)) + Sin(WorksheetFunction.Radians(90 - Lat1)) * Sin(WorksheetFunction。 Lat1)) * Sin(WorksheetFunction.Radians(90 - Lat1)) Lat2)) * Cos(WorksheetFunction.Radians(Lng1 - Lng2))) * 6371

結束功能

正如您所看到的,它們是完全相同的。由於VBA中沒有Acos或Radians函數,它甚至使用「worksheetFunction」方法。

為什麼當我將這些公式應用於同一對 XY 座標時,會得到不同的結果?

例如:

從 ABC 45.4960674,-73.514446 到 XYZ 43.5369,-71.8592

距離XY()結果:254.313156128

長公式法: 254.313268914

按照 @raystafarian 的評論,將所有類型更改為雙倍提高了精度。但還是有差別的。

函數 DistXY(Lat1 As double, Lng1 As double, Lat2 As double, Lng2 As double) As double ...

新結果:

距離XY(): 254.3132689135060公里

長公式法: 254.3132689135250公里

答案1

您正在使用(並返回)以下資料類型單身的。如果函數採用不同的預設資料類型,這將導致函數進行不同的計算。

答案2

基於雷斯塔法里安的答:

Public Function DistXY(Lat1 As Double, Lng1 As Double, Lat2 As Double, Lng2 As Double) As Double
   Dim i As Double, f As Double
   Dim wf As WorksheetFunction
   Set wf = Application.WorksheetFunction

   i = 90
   f = 6371

   DistXY = wf.Acos(Cos(wf.Radians(i - Lat1)) * Cos(wf.Radians(i - Lat2)) + Sin(wf.Radians(i - Lat1)) * Sin(wf.Radians(i - Lat2)) * Cos(wf.Radians(Lng1 - Lng2))) * f
End Function

在此輸入影像描述

相關內容