JavaとExcelの有効桁数の違いとPOIでの取り込み
概要
JavaとExcelとで実数(浮動小数点)の有効桁数が異なる。
Excel内で計算式が適用されているセルをPOIで取り込むとJavaの有効桁数で再計算されるため(?)誤差が生じる。
値によっては人間が見える桁で差が生じてしまうので注意が必要。
※POIのソースを検証したわけではないので原因は推測
検証
Excelでの結果
A1セルはB列の合計値を小数点以下2桁目まで表示したもの、A2セルもB列の合計値。
ここからExcelでは情報落ちにより「厳密に1.115」と判断され、四捨五入の結果「1.12」が表示されていることがわかる。
Javaコード
public static void main(String[] args) throws EncryptedDocumentException, InvalidFormatException, FileNotFoundException, IOException{ Workbook wb = WorkbookFactory.create(new FileInputStream("data/input2.xlsx")); Sheet sheet = wb.getSheet("Sheet1"); double v = sheet.getRow(0).getCell(0).getNumericCellValue(); // A1セルを取得 System.out.println(v); BigDecimal bd = new BigDecimal(String.valueOf(v)); System.out.println(bd); System.out.println(bd.setScale(2, BigDecimal.ROUND_HALF_UP)); }
Java実行結果
1.1149999999999989 1.1149999999999989 1.11
-1e-15の加算が反映されて「1.11499...」と判断されている。そのため四捨五入の結果は「1.11」になる。