業務背景:mysql中A表中的B字段的類型是decimal類型,小數位數是三位,某一條數據的值是3000000,在Java中查詢出來的結果是3000000.000,這樣顯示在頁面中不太好看,用戶希望看到是3000000。
解決辦法:使用 stripTrailingZeros().toPlainString()來解決。下面舉例說明如何去掉BigDecimal類型變量小數點后多余的零:
BigDecimal testData = new BigDecimal("3000000.000"); System.out.println("直接轉換成字符串后輸出:" + testData.toString()); System.out.println("去掉尾部無用的零轉並轉換成字符串后輸出:" + testData.stripTrailingZeros().toString()); System.out.println("只展示數值:" + testData.stripTrailingZeros().toPlainString()); System.out.println("工程計數法輸出:" + testData.stripTrailingZeros().toEngineeringString());
測試結果:
直接轉換成字符串后輸出:3000000.00 去掉尾部無用的零轉並轉換成字符串后輸出:3E+6 只展示數值:3000000 工程計數法輸出:3E+6
但是,如果將3000000.000改為3000000.700等,小數點后面有非零數字的場景,則stripTrailingZeros().toString()不會輸出為科學計數法。
toString(),toPlainString(),toEngineeringString() 這三個方法都是用於將BigDecimal 轉換成字符串,不同之處是toString()有可能會使用科學記數法,toPlainString()只展示數值,不使用科學記數法,toEngineeringString()工程計數法,與科學技術法類似,但要求10的冪必須是3的倍數。
toPlainString
|
toString
|
toEngineeringString
|
1000
|
1 * 10^3
|
1 * 10^3
|
10000
|
1 * 10^4
|
10 * 10^3
|
100000
|
1 * 10^5
|
100 * 10^3
|
1000000
|
1 * 10^6
|
1 * 10^6
|
但是,下面的方法不可以使用stripTrailingZeros()去除末尾無用的零,只能手動轉換。
public static void main(String[] args) { BigDecimal ratio= new BigDecimal("0.00"); System.out.println(ratio.stripTrailingZeros().toPlainString()); // 自行判斷,判斷相等的時候,使用comparTo(),equals()不靠譜
if (0 == BigDecimal.ZERO.compareTo(ratio)) { System.out.println("0"); } if (!BigDecimal.ZERO.equals(ratio)) { System.out.println(" 居然不相等 "); } }
總結:BigDecimal是處理高精度的浮點數運算的常用的一個類,當需要將BigDecimal中保存的浮點數值打印出來,特別是在頁面上顯示的時候,就有可能遇到意料之外的科學技術法表示的問題。
stripTrailingZeros()可以去除小數點后多余的0,用科學記數法表示,再結合toPlainString()即可輸出數值。