2010-12-10 116 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){ 
} 
相關問題