2016-10-24 83 views
-2

我有一個地址域,其中有場lat和只要BigDecimal和我使用規模限制爲16.我有這個地址BigDecimal的問題,長和緯度

550 Tremont St, Boston, MA 02116, USA 

其長,LAT是 - 71.07126540000002和42.3438919

此地址的經度以-71.0712654000000200存儲在數據庫中。現在我需要將保存的經度與任何新的請求進行比較,以檢查經度是否已經存在。

我再次發送相同的經度-71.07126540000002但我無法將它保存在db(-71.0712654000000200)中的格式轉換爲比較長的格式。地址相同。

我嘗試使用

BigDecimal a = new BigDecimal(-71.07126540000002) 
println a.setScale(16, RoundingMode.CEILING)​ // tried all other RoundingMode 

但都給予響應,無論是-71.0712654000000156或-71.0712654000000157,但沒有得到-71.0712654000000200

幫助!

+0

在我看來,這兩個值都有7位數的精度,剩下的只是錯誤。當你有15-16位數的精度時,舍入到16位小數是不合適的。 –

+2

這樣做的確切表示:'BigDecimal a = new BigDecimal(「 - 71.07126540000002」)'。雙打沒有小數部分的確切表示。 –

+0

尋找完全匹配有點荒謬。你給出的數字比相隔一個微米要小几個數量級。出於所有實際原因,這是相同的位置。 – Henry

回答

1

應該因爲14後的POS使用

a.setScale(14, RoundingMode.HALF_UP) 

。零點不是有意義

在年底將-71.07126540000002

1

您也可以只使用BigDecimal的符號:

-71.0712654000000200000g​.setScale(16)​-71.07126540000002000000G.setScale(16)

兩個結果:

-71.0712654000000200

另一種選擇是設置自定義MathContext