2017-10-10 82 views
-3

我有以下功能,並且我無法更改double類型的參數。如何在不失去精度的情況下使用double作爲函數參數?

double latitude = coordinate.x; 
double longitude = coordinate.y; 
createEPoint(latitude, longitude)); 

的瓦爾經度和緯度有大量的小數(35.94777225005756),我需要保持它的精度。我知道我可以使用BigDecimal或其他類,但正如我所說我不能修改createEPoint(double lat, double lon)的參數。

現在,當我得到EPoint的參數時,經緯度值自動舍入,你有什麼想法來避免這種情況並保持數字的精度?

+1

那麼,如果雙失去精度,那麼除了改變參數的類型,你不能做太多的事情。 – Thomas

+0

這就是@Deprecated註解派上用場的時候。所以考慮重載你的方法。 –

+4

如果您必須接受雙打,那麼已經太晚了。有沒有什麼神奇的方式來獲得一個雙精度比它進來時更精確。 – khelwood

回答

2

與35.94777225005756的最接近的兩倍具有確切的值35.94777225005756093878517276607453823089599609375,其Double.toString結果默認打印輸出爲35.94777225005756。

從十進制數轉換爲雙精度時存在固有的精度損失,沒有任何東西可以恢復。您必須使用BigDecimal座標來存儲和攜帶該點的第二個表示。

但是,在1e15中任何物理位置都不可能測量到一個部分,這是小數點 - 雙十進制轉換的近似精度。如果如變量名稱所示,這是與周長爲40,075公里的球體上的位置成角度的度數,則精度損失遠小於微米。

相關問題