Java 將科學計數法的數字轉成完整的數字展示;double型別的小數值不準確的處理
阿新 • • 發佈:2019-02-20
首先是從Excel裡面讀資料的時候,Excel裡面的資料是數字,太大,其實也不是數字,就是個銀行卡號,複製進去,就自動成數字啦,然後就變成科學計數法啦,在使用poi讀取資料的時候,讀出來的就是科學計數法的數字,tostring之後,就不是我們想要的資料啦,這是一種情況。
還有一種情況,就是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; }
那就很尷尬啦
我寫完文章,給自己點個贊,不過分吧,
不過分,那我可就點啦啊。
我先點為敬,你們隨意。大家隨意。不要客氣。。。