2

我正在尝试将单元格值设置为一个不错的float值。我想将单元格值设置为5.2,但我得到5.1999998093了。对此有什么解决方案?

Workbook workbook = new HSSFWorkbook();
Sheet worksheet = workbook.createSheet();
CellStyle style = workbook.createCellStyle();
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.0"));

int i = 0;
worksheet.createRow(i + 1);
worksheet.getRow(i + 1).createCell(0).setCellStyle(style);
worksheet.getRow(i + 1).getCell(0).setCellValue(new BigDecimal("5.2").floatValue());
4

4 回答 4

5

你们没有很好地理解我的问题。一个解决方案是更改数据格式:

DataFormat format = workbook.createDataFormat();
style.setDataFormat(format.getFormat("#.#"));
于 2013-10-12T10:36:35.993 回答
3

没有理由通过使用float. 如果BigDecimal您只需要一个float.

因为5.2不能精确地表示为二进制数,所以最接近float真正的“5.2”值的是5.19999980926513. 如果您需要单元格为数字,则可以使用double更精确的 a 。此外,该setCellValue方法被重载为采用 adouble,而不是 a float

您有问题的线路:

worksheet.getRow(i + 1).getCell(0).setCellValue(new BigDecimal("5.2").floatValue());

...可以用更简单的东西代替:

worksheet.getRow(i + 1).getCell(0).setCellValue(5.2);

与使用浮点文字或 from获得的值相比,该double5.2更接近“真实” 5.2 值。您将在 Excel、实际单元格和显示实际单元格值的栏中看到。您甚至不需要设置数据格式。float5.2f5.2fnew BigDecimal("5.2").floatValue()5.2

如果您需要使用BigDecimal,可能是因为您BigDecimal从其他地方获得了 a ,并且您在此处使用 简化了代码示例new BigDecimal("5.2"),那么至少调用doubleValue(),您仍然可以使用 a 设置单元格值double

worksheet.getRow(i + 1).getCell(0).setCellValue(new BigDecimal("5.2").doubleValue());
于 2013-10-14T16:44:09.300 回答
1

你可以使用BigDecimal.setScale 简单的例子

 BigDecimal a = BigDecimal.valueOf(5.165);
    BigDecimal roundOff = a.setScale(2, BigDecimal.ROUND_HALF_EVEN);
    System.out.println(roundOff);

输出

5.2

这是另一种方式

double d = 5.165;
DecimalFormat f = new DecimalFormat("##.0");
System.out.println(f.format(d));

输出 5.2

于 2013-10-12T10:08:08.180 回答
-1

您可以使用toPlainString()而不是floatValue()

new BigDecimal("5.2").toPlainString()

编辑:

new BigDecimal("5.2").setScale(2).floatValue()
于 2013-10-12T10:05:36.627 回答