2017-02-10 79 views
0

请在下面找到代码片段。该实现读取Excel表格中特定列的单元格值。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

Excel的结果比Java更圆整。存储的真正价值可能是459000.00000000006,但显示为459000.0

如果我输入459000.00000000006到Excel会显示459000

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

例如回合到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

相关问题