2013-02-04 57 views
2

我有小數(19,5)大小的數據庫列,我想一個BigDecimal在java中存儲的價值,但如果我寫如何初始化BigDecimal與一個非常精確的浮點值

BigDecimal(999999999999999.9999); 

該值被舍入到1 + E15,我不希望它是,所以我怎麼能得到數字的完整精度。我知道

一種方法是使用

BigDecimal("999999999999999.9999"); 

我覺得應該有一個更好的選項來指定精度。

+1

鑑於您知道路。現在你爲什麼認爲這不是一個更好的選擇?你有什麼具體問題嗎? –

+3

999999999999999.9999在'double'中不能完全表示,所以不起作用。 –

+0

沒有問題,但我得到的只是數值,所以我不想將它們轉換爲字符串,沒有其他方法可以做到這一點嗎? – pavi

回答

6

您需要使用一個構造函數,其採用String,因爲double常量的值在編譯器進入BigDecimal的構造函數之前進行了四捨五入。換句話說,編譯器會看到您的999999999999999.9999不變,並將其轉換爲doubledouble類型沒有足夠的精度來存儲所有九個值,因此該值四捨五入爲1+E15,這就是傳遞給BigDecimal的構造函數的值。程序執行第一條指令之前精度已經消失。

另一方面,當你傳遞一個字符串時,你讓BigDecimal做9個序列的解釋,確保你得到你需要的確切精度。

2

您必須在這裏使用BigDecimal的主要原因是該值不適合雙精度型。當傳遞給BigDecimal的構造函數時,double值將被舍入,所以無論你做什麼,你都不能恢復原始值,如果你只傳遞一個double值。所以你沒有更好的選擇 - 像你一樣使用BigDecimal