POI将小数写入EXCEL,1.01变成1.00999999046325
- Java code
public static boolean CreateExcel() { String FileName; FileName = ""; FileOutputStream fileOut = null; try { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); wb.setSheetName(0,"测试",HSSFWorkbook.ENCODING_UTF_16); HSSFRow row0 = sheet.createRow(0); HSSFRow row1 = sheet.createRow(1); String strf = "1.01"; float f = Float.valueOf(strf).floatValue(); HSSFCell cell = row0.createCell((short)0); cell.setCellValue( strf); //这个是字符的1.01,导出后每次都得手工改成数字型 cell = row1.createCell((short)0); cell.setCellValue( f); //单元格里看到的是1.01,但实际值却是1.00999999046325 ,数据多时,恐有误差。 String filepath = "c:\\poi.xls"; fileOut = new FileOutputStream(filepath); wb.write(fileOut); fileOut.flush(); fileOut.close(); } catch(Exception ex) { ex.printStackTrace(); return false; } finally { try { fileOut.close(); } catch(Exception e) { e.printStackTrace(); } } return true; } [解决办法]
如果你对数值的精确度有比较高的要求,那么就不要用float类型,java里面的float类型是有误差的,用BigDecimal比较靠谱
[解决办法]
写入之前输出一下吧,如果输入之前就已经改变的话那就合poi没关系了。
像楼上说的推荐用BigDecimal,float有误差。
嫌麻烦的话直接用字符串!
[解决办法]
有金额,或小数点位要求精度高时不用float,也不用double
用BigDecimal。
[解决办法]
float f = Float.valueOf(strf).floatValue();
换成如下形式:
BigDecimal f = BigDecimal(strf);
[解决办法]
float 和 double 都是会这样的 并不是POI的原因 不信你可以输出一下, 我之前从数据库里读出数据也遇到过。你可以转换成String.
[解决办法]
精度范围问题。。用double应该能搞定。。
[解决办法]
我更建议你直接使用字符串,而不是转换数据类型。