2017-02-10 3 views
0

Veuillez trouver ci-dessous l'extrait de code. L'implémentation lit les valeurs de cellule pour une colonne particulière dans une feuille Excel.Les valeurs de cellules numériques dans Excel sont lues anormalement avec des chiffres supplémentaires ajoutés après le point décimal

Les valeurs numériques telles que 459000.00 sont lues par le code 459000.00000000006. Cela fonctionne bien pour quelques-uns des nombres, mais échoue pour certains.

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

Répondre

1

Excel arrondit le résultat plus que Java. La vraie valeur stockée peut être 459000,00000000006 et afficher encore comme 459000.0

Si je 459000.00000000006 entrée dans Excel il affiche 459000

Une solution simple est d'utiliser un peu arrondi du nom que vous obtenez.

par exemple. Round 6 décimales

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