为什么我构建的公式给出的结果与 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.弧度(90 - 纬度 1)) * Cos(WorksheetFunction.弧度(90 - 纬度 2)) + Sin(WorksheetFunction.弧度(90 - 纬度 1)) * Sin(WorksheetFunction.弧度(90 - 纬度 2)) * Cos(WorksheetFunction.弧度(经度 1 - 经度 2))) * 6371

结束函数

如您所见,它们完全相同。由于 VBA 中没有 Acos 或 Radians 函数,它甚至使用“worksheetFunction”方法。

为什么当我将这些公式应用于同一对 XY 坐标时,我会得到不同的结果?

例如:

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

距离XY()结果:254.313156128

长公式法地址:254.313268914

按照@raystafarian的评论,将所有类型更改为double可以提高精度。但仍然存在差异。

函数 DistXY(Lat1 作为双精度型,Lng1 作为双精度型,Lat2 作为双精度型,Lng2 作为双精度型) 作为双精度型...

新结果:

距离XY()地址:254.3132689135060公里

长公式法地址:254.3132689135250公里

答案1

您正在使用(并返回)以下数据类型:单身的如果函数采用不同的默认数据类型,这将导致函数的计算结果不同。

答案2

基于Raystafarian 的回答:

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

在此处输入图片描述

相关内容