Java 科學計數法轉成完整數字展示;double類型小數值不準確處理
還有一種情況,就是Excel裏面的小數比如,1.2讀出來可能就是1.19999,這個就是double類型的小數的值不準確的問題啦。
說是可以使用 BigDecimal 類來解決這個問題,但是,這個類要想使用好,也得有一番實踐操作的。
先看代碼,
/**
BigDecimal的測試,要精確。
- 還要使得科學計數法的數字,做完全的展示。
*/
private static void testBigDecimal() {
Double d = 1.6D;
//不準確的初始化
BigDecimal bigDecimal = new BigDecimal(d);
System.out.println(bigDecimal);
//使得結果精確的初始化姿勢
bigDecimal = new BigDecimal(d.toString());
System.out.println(bigDecimal);
bigDecimal = new BigDecimal("6.214822313132341212666E+18");
System.out.println(bigDecimal.toPlainString());
}
再看下運行的結果。
可以看到差別了嗎?
可以看到,這個構造函數傳進去的參數類型不同,出來的結果,就很不一樣。
所以,咱在使用這個類的時候,還是傳個字符串類型的參數進去,這樣就穩當點。
這樣就解決啦,double類型的小數的不準確性的問題,不用去考慮,到底精確幾位小數的問題。同時,還把科學計數法的數字,給格式化成OK的字符串來展示。
最後,就是為啥把這篇文章分在poi的分類裏面,因為就是在讀取Excel文檔的數據的時候,發現的問題。
它讀取每個cell的時候,會根據cell的類型不一樣,獲得的值也不一樣。
還有就是,要是數字的話,他竟然還有科學計數法的問題,以及小數值不準確的問題,比如1.6,讀出來可能就是1.59999
下面是獲取 cell的值的方法
/**
獲取單元格數據內容為字符串類型的數據
@param cell Excel單元格
- @return String 單元格數據內容
*/
public static String getCellStringValue(HSSFCell cell) {
String strCell;
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
strCell = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
Double value = cell.getNumericCellValue();
BigDecimal bd1 = new BigDecimal(Double.toString(value));
strCell = bd1.toPlainString();
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
strCell = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK:
strCell = "";
break;
default:
strCell = null;
break;
}
return strCell;
}
重點就是當是數字類型的時候,就需要好好處理一下啦。不然,讀取出來的數字要麽是科學計數法,要麽就是已經失去準確性的小數啦。
那就很尷尬啦
Java 科學計數法轉成完整數字展示;double類型小數值不準確處理