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;
    } 

解决方案 »

  1.   

    如果你对数值的精确度有比较高的要求,那么就不要用float类型,java里面的float类型是有误差的,用BigDecimal比较靠谱
      

  2.   

    写入之前输出一下吧,如果输入之前就已经改变的话那就合poi没关系了。
    像楼上说的推荐用BigDecimal,float有误差。
    嫌麻烦的话直接用字符串!
      

  3.   

    有金额,或小数点位要求精度高时不用float,也不用double
    用BigDecimal。
      

  4.   

    float f = Float.valueOf(strf).floatValue();
    换成如下形式:
    BigDecimal f = BigDecimal(strf);
      

  5.   

    float 和 double 都是会这样的 并不是POI的原因 不信你可以输出一下, 我之前从数据库里读出数据也遇到过。你可以转换成String.
      

  6.   

    精度范围问题。。用double应该能搞定。。
      

  7.   

    感谢各位的回帖,一直搞不明白是怎么回事以下是测试
    cell.setCellValue(1.01); //正常float f = 1.01;
    cell.setCellValue( f); //有误差double d = 1.01;
    cell.setCellValue(d);//正常--------------于是将上面的两行代码    String strf = "1.01";
        float f = Float.valueOf(strf).floatValue(); 改成如下:
     
     String strf = "1.01";
     double d =  Double.valueOf(strf).doubleValue()
     
    就正常了,不是太明白为什么会这样
      

  8.   

    精度问题
    跟朋友交流了下
    得出的结论float f = 0.5 这个是没问题也就是那些恰好是2的负几次方累计的数均可以0.5 0.75 0.875 ----------------结帖