excel中的数字单元格值被异常读取,小数点后附加了额外的数字

时间:2017-02-10 11:25:22

标签: java excel apache-poi numeric

请在下面找到代码段。该实现读取excel表中特定列的单元格值。

459000.00等数字值正由代码读取为459000.00000000006。对于少数数字而言它工作正常,但对某些人来说是失败的。

 try
                {
                String AmountColumn="C";
                File FS = new File(FileLocation);
                FileInputStream FileStream = new FileInputStream(FS);
                XSSFWorkbook FileWorkbook = new XSSFWorkbook(FileStream);
                Sheet FileWorksheet = FileWorkbook.getSheetAt(0);
                double[] AmountArray = new double[FileWorksheet.getPhysicalNumberOfRows() - 1];
                Iterator<Row> iterator2 = FileWorksheet.iterator();
                int i2 = 0;

                while (iterator2.hasNext())
                {
                if (i2 == 0)
                {
                iterator2.next();
                }
                else
                {
                AmountArray[i2 - 1] = iterator2.next().getCell(CellReference.convertColStringToIndex(AmountColumn)).getNumericCellValue();
                System.out.println("Amount is: " + AmountArray[i2 - 1]);
                }
                i2++;
                }
                Amount = AmountArray;
                }
                catch (Exception e)
                {
                e.printStackTrace();
                }

1 个答案:

答案 0 :(得分:1)

Excel比Java更多地舍入结果。存储的真实值可能是459000.00000000006,但仍显示为459000.0

如果我将459000.00000000006输入Excel,则会显示459000

一个简单的解决方案是使用你得到的名字的一点点。

e.g。小数点后6位

/**
 * Performs a round which is accurate to within 1 ulp. i.e. for values very close to 0.5 it
 * might be rounded up or down. This is a pragmatic choice for performance reasons as it is
 * assumed you are not working on the edge of the precision of double.
 *
 * @param d value to round
 * @return rounded value
 */
public static double round6(double d) {
    final double factor = 1e6;
    return d > WHOLE_NUMBER / factor || d < -WHOLE_NUMBER / factor ? d :
            (long) (d < 0 ? d * factor - 0.5 : d * factor + 0.5) / factor;
}

https://github.com/OpenHFT/Chronicle-Core/blob/master/src/main/java/net/openhft/chronicle/core/Maths.java#L121