2010-12-10 64 views
0

我有这段代码来找到两组GPS坐标之间的距离,我从网上的其他地方得到了代码。纬度/经度向量距离,输出奇怪的问题

function distance($lat1, $lon1, $lat2, $lon2, $unit) { 

    $theta = $lon1 - $lon2; 
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
    $dist = acos($dist); 
    $dist = rad2deg($dist); 
    $miles = $dist * 60 * 1.1515; 
    $unit = strtoupper($unit); 

    if ($unit == "K") { 
    return ($miles * 1.609344); 
    } else if ($unit == "N") { 
     return ($miles * 0.8684); 
    } else { 
     return $miles; 
     } 
} 

的输出中返回看起来是这样的:25.44049但如果我不

$distance_output = distance(-50.12345, 100.1235,-60.12345,120.12345,'km'); 
echo $distance_output . '<br />; 
echo $distance_output - 15.12345; 

它输出这样的:

15.12345 
1.23639038e10 

这些都是编造的数字,但可以看到距离()的输出看起来像一个数字,但是当我从它减去相同的数字时,它会吐出一个奇怪的指数数字。有任何想法吗?

非常感谢

+0

我怀疑是第二数字格式为“e-10”(注意减号),这是一个非常小的值。如果是的话,那么你所看到的与距离计算无关,以及与计算机如何处理浮点数有关的一切。 – Anon 2010-12-10 21:29:42

+0

未来,请将脚本的确切输出复制到问题中。 “编造”数字导致回答可能会或可能不会回答您的实际问题。 – Anon 2010-12-10 21:30:23

回答

0

我想你的代码(你只是错过了一个简单的报价),而输出是1042.1216629565和1026.9982129565,似乎确定了我。

如果我减去1042.1216629565到1042.1216629565,则输出变为3.092281986028E-11:请注意减去字符e之后的字符。

这个数字等于0.00000000003092281986028,而不是零。这种差异在浮点运算中很常见。它可以通过在值二进制编码中舍入误差来解释。

查看维基百科:http://en.wikipedia.org/wiki/Floating_point特别是关于四舍五入的部分。

如果你想显示的结果,使用number_format()

如果要比较两个浮点值,你就必须做用这样的事情:

$epsilon = 1e-6; 
if (abs($value1-$value2) <= $epsilon){ 
} 
相关问题