zoukankan      html  css  js  c++  java
  • java操作Excel处理数字类型的精度损失问题验证

    java操作Excel处理数字类型的精度损失问题验证:

    场景:

    CELL_TYPE_NUMERIC-->CELL_TYPE_STRING--->CELL_TYPE_NUMERIC

    POI版本:
    poi-3.10.1
    poi-3.9

    Code:

    package poi;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    
    public class DoubleWithStringNumeric {
    
        private static final String excelName="DoubleWithStringNumberic.xls";
        public static void main(String[] args) throws IOException {
            int double_idx=0;
            int double2String_idx=1;
            int string2double_idx=2;
            Workbook wb=new HSSFWorkbook();
            Sheet sheet=wb.createSheet("DoubleWithStringNumberic");
            Row row=sheet.createRow(1);
            Cell cell=row.createCell(double_idx);
            cell.setCellType(Cell.CELL_TYPE_NUMERIC);
            cell.setCellValue(99.333333);
            
            persistWorkbook(wb);
            
            travelSheet();
            
            System.out.println("Type: CELL_TYPE_NUMERIC==>CELL_TYPE_STRING");
            InputStream s=new FileInputStream(excelName);
            wb=new HSSFWorkbook(s);
            sheet=wb.getSheetAt(0);
            row=sheet.getRow(1);
            cell=row.getCell(0);
            Double d=cell.getNumericCellValue();
            
            cell=row.createCell(double2String_idx);
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue(String.valueOf(d));
            
            persistWorkbook(wb);
            s.close();
            
            travelSheet();
            
            System.out.println("Type: CELL_TYPE_STRING==>CELL_TYPE_NUMERIC");
            s=new FileInputStream(excelName);
            wb=new HSSFWorkbook(s);
            sheet=wb.getSheetAt(0);
            row=sheet.getRow(1);
            cell=row.getCell(double2String_idx);
            String double2String=cell.getStringCellValue();
            cell=row.createCell(string2double_idx);
            cell.setCellType(Cell.CELL_TYPE_NUMERIC);
            cell.setCellValue(Double.parseDouble(double2String));
            persistWorkbook(wb);
            s.close();
            
            travelSheet();
            
        }
    
        private static void travelSheet() throws FileNotFoundException, IOException {
            Workbook wb;
            Sheet sheet;
            InputStream s=new FileInputStream(excelName);
            wb=new HSSFWorkbook(s);
            sheet=wb.getSheetAt(0);
            for (Row row_temp : sheet) {
                for (Cell cell_temp : row_temp) {
                    getCellValue(cell_temp);
                }
            }
            s.close();
        }
    
        private static void getCellValue(Cell cell) {
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_NUMERIC:
                System.out.println("CELL_TYPE_NUMERIC:"+cell.getNumericCellValue());
                break;
            case Cell.CELL_TYPE_STRING:
                String stringCellValue = cell.getStringCellValue();
                System.out.println("CELL_TYPE_STRING:"+stringCellValue);
                System.out.println("toDouble:"+Double.parseDouble(stringCellValue));
                break;
            default:
                System.out.println("error");
                break;
            }
            
        }
    
        private static void persistWorkbook(Workbook wb)
                throws FileNotFoundException, IOException {
            OutputStream stream=new FileOutputStream(excelName);
            wb.write(stream);
            stream.flush();
            stream.close();
        }
    
    }

    Output:

    CELL_TYPE_NUMERIC:99.333333
    Type: CELL_TYPE_NUMERIC==>CELL_TYPE_STRING
    CELL_TYPE_NUMERIC:99.333333
    CELL_TYPE_STRING:99.333333
    toDouble:99.333333
    Type: CELL_TYPE_STRING==>CELL_TYPE_NUMERIC
    CELL_TYPE_NUMERIC:99.333333
    CELL_TYPE_STRING:99.333333
    toDouble:99.333333
    CELL_TYPE_NUMERIC:99.333333

    结论:

    此场景无精度损失。

  • 相关阅读:
    [转] Chrome
    阿里安全潘多拉实验室首先完美越狱苹果iOS 11.2
    【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件
    卡巴斯基发布安全公告:2018年威胁预测
    【阿里聚安全·安全周刊】双十一背后的“霸下-七层流量清洗”系统| 大疆 VS “白帽子”,到底谁威胁了谁?
    分享一个白帽交流灵感的社区——先知技术安全社区
    WiFi网络WPA2 KRACK漏洞分析报告
    #云栖大会# 移动安全专场——APP渠道推广作弊攻防那些事儿(演讲速记)
    #云栖大会# 移动安全专场——APP加固新方向(演讲速记)
    Java安全编码:糟糕的在线建议和令人困惑的APIs
  • 原文地址:https://www.cnblogs.com/softidea/p/4205595.html
Copyright © 2011-2022 走看看