我有小數(19,5)大小的數據庫列,我想一個BigDecimal在java中存儲的價值,但如果我寫如何初始化BigDecimal與一個非常精確的浮點值
BigDecimal(999999999999999.9999);
該值被舍入到1 + E15,我不希望它是,所以我怎麼能得到數字的完整精度。我知道
一種方法是使用
BigDecimal("999999999999999.9999");
我覺得應該有一個更好的選項來指定精度。
我有小數(19,5)大小的數據庫列,我想一個BigDecimal在java中存儲的價值,但如果我寫如何初始化BigDecimal與一個非常精確的浮點值
BigDecimal(999999999999999.9999);
該值被舍入到1 + E15,我不希望它是,所以我怎麼能得到數字的完整精度。我知道
一種方法是使用
BigDecimal("999999999999999.9999");
我覺得應該有一個更好的選項來指定精度。
您需要使用一個構造函數,其採用String
,因爲double
常量的值在編譯器進入BigDecimal
的構造函數之前進行了四捨五入。換句話說,編譯器會看到您的999999999999999.9999
不變,並將其轉換爲double
。 double
類型沒有足夠的精度來存儲所有九個值,因此該值四捨五入爲1+E15
,這就是傳遞給BigDecimal
的構造函數的值。程序執行第一條指令之前精度已經消失。
另一方面,當你傳遞一個字符串時,你讓BigDecimal
做9個序列的解釋,確保你得到你需要的確切精度。
您必須在這裏使用BigDecimal
的主要原因是該值不適合雙精度型。當傳遞給BigDecimal
的構造函數時,double值將被舍入,所以無論你做什麼,你都不能恢復原始值,如果你只傳遞一個double值。所以你沒有更好的選擇 - 像你一樣使用BigDecimal
。
鑑於您知道路。現在你爲什麼認爲這不是一個更好的選擇?你有什麼具體問題嗎? –
999999999999999.9999在'double'中不能完全表示,所以不起作用。 –
沒有問題,但我得到的只是數值,所以我不想將它們轉換爲字符串,沒有其他方法可以做到這一點嗎? – pavi