日期:2014-05-17  浏览次数:20883 次

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应该能搞定。。
------解决方案--------------------
我更建议你直接使用字符串,而不是转换数据类型。