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

结论:

此场景无精度损失。

原文地址:https://www.cnblogs.com/softidea/p/4205595.html