首先是从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; 
    }
重点就是当是数字类型的时候,就需要好好处理一下啦。不然,读取出来的数字要么是科学计数法,要么就是已经失去准确性的小数啦。

那就很尴尬啦

我写完文章,给自己点个赞,不过分吧,
不过分,那我可就点啦啊。
我先点为敬,你们随意。大家随意。不要客气。。。


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java NIO:浅析I/O模型知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。