2017-02-10 5 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