2017-02-10 4 views
0

. Nachfolgend finden Sie das Code-Snippet. Die Implementierung liest Zellenwerte für eine bestimmte Spalte im Excel-Arbeitsblatt.Numerische Zellenwerte in Excel werden abnormal gelesen, mit zusätzlichen Ziffern nach dem Dezimalpunkt

Numerische Werte wie 459000.00 werden vom Code als 459000.00000000006 gelesen. Es funktioniert gut für einige der Zahlen, aber scheitert für einige.

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(); 
       } 

Antwort

1

Excel macht mehr Abrundung des Ergebnisses als Java. Der wahre Wert gespeichert könnte 459000,00000000006 sein und doch als 459000.0

anzuzeigen Wenn ich Eingang 459000.00000000006 in Excel zeigt es 459000

Eine einfache Lösung ist es, eine kleine Rundung des Namens zu verwenden, die Sie erhalten.

z.B. Runde mit 6 Dezimalstellen

/** 
* 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

Verwandte Themen