JavaとExcelの有効桁数の違いとPOIでの取り込み

概要

JavaExcelとで実数(浮動小数点)の有効桁数が異なる。
Excel内で計算式が適用されているセルをPOIで取り込むとJavaの有効桁数で再計算されるため(?)誤差が生じる。
値によっては人間が見える桁で差が生じてしまうので注意が必要。
※POIのソースを検証したわけではないので原因は推測

検証

Excelでの結果

f:id:kurukuruz:20180524151237j:plain
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」になる。