将 excel 数据读入 Java 时出现格式问题

Format Issue while reading excel data into Java

我正在使用 java apache 读取 Excel 数据。我在将诸如 869.87929(在 excel 中)之类的双精度值读入 869.8792899999999(在 java 中)时遇到格式问题。

我正在使用以下文件读取 excel 数据。
1. Schema.csv: SheetName,2-int-Double

2. File.xls:

col1 |列2 123 | 869.87929

示例代码:

if(type.equals("Double")){
            Double fval=Double.parseDouble(content[i-1]);
            String sval=fval.toString();
            listObjects.add(new Double(Double.parseDouble(sval)));
        }

注意:类型来自 schema.csv & 内容 [] 值来自 file.xls

Double 不利于保持精度。 Preffered 使用 BigDecimal。我相信这是你的问题。

https://blogs.oracle.com/CoreJavaTechTips/entry/the_need_for_bigdecimal

没有必要将数字来回转换为字符串,因为这不会做任何有用的事情。

试试

listObjects.add(new BigDecimal(content[i-1]));

你可以用四舍五入

listObjects.add(new BigDecimal(content[i-1]).setScale(9, RoundingMode.HALF_UP));

虽然我怀疑舍入错误已经发生在这一点之前,因为这应该做与

基本相同的事情
listObjects.add(new Double(content[i-1]));

你可以用四舍五入

double d = Double.parseDouble(content[i-1]);
double round9 = Math.round(d * 1e9) / 1e9;
listObjects.add((Double) round9);

这些是差不多的,因为数字在double的精度范围内,这里应该不会有额外的错误(即错误很可能在这个点之前)

如果您使用 Apache POI - 您可以使用 getCellType()==Cell.CELL_TYPE_NUMERIC 比较和来自 Cell 界面的 getNumericCellValue()