• 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

    结论:

    此场景无精度损失。

  • 相关阅读:
    404、500、502等HTTP状态码介绍
    Linux系统信息查看命令
    SVN clean up 无法继续
    gitlab使用
    Git SSH Key 生成步骤
    gitlab 杂记
    JS函数
    MySQL基础
    WEB测试方法
    操作系统的发展史
  • 原文地址:https://www.cnblogs.com/softidea/p/4205595.html
Copyright © 2020-2023  润新知