Matching Excel's floating point in Java

后端 未结 6 1326
长发绾君心
长发绾君心 2020-12-11 02:06

I have an .xlsx spreadsheet with a single number in the top-left cell of sheet 1.

The Excel UI displays:

-130.98999999999

This is v

6条回答
  •  情歌与酒
    2020-12-11 02:38

    I use this for calculating the same 15 digit display value.

    private static final int EXCEL_MAX_DIGITS = 15;
    
    /**
     * Fix floating-point rounding errors.
     *
     * https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel
     * https://support.microsoft.com/en-us/kb/214118
     * https://support.microsoft.com/en-us/kb/269370
     */
    private static double fixFloatingPointPrecision(double value) {
        BigDecimal original = new BigDecimal(value);
        BigDecimal fixed = new BigDecimal(original.unscaledValue(), original.precision())
                .setScale(EXCEL_MAX_DIGITS, RoundingMode.HALF_UP);
        int newScale = original.scale() - original.precision() + EXCEL_MAX_DIGITS;
        return new BigDecimal(fixed.unscaledValue(), newScale).doubleValue();
    }
    

提交回复
热议问题