[alibaba/easyexcel]@NumberFormat注解转换double时可能会丢失精度

2024-05-21 798 views
2

触发场景描述 用@NumberFormat注解转换double类型 触发Bug的代码

//表格映射对象double属性
  /**
   * 格式化百分比
   */
  @NumberFormat("#.##%")
  @ExcelProperty("百分比")
  private Double num;

//读取excel的Listener
  @Override
  public void invoke(DemoData demoData, AnalysisContext analysisContext) {
    int row = analysisContext.readRowHolder().getRowIndex();
    int sheetNo = analysisContext.readSheetHolder().getSheetNo();
    String sheetName = analysisContext.readSheetHolder().getSheetName();
    log.info("读取到[{}]的第{}行记录:{}", sheetName, row, JSONObject.toJSONString(demoData));
  }

提示的异常或者没有达到的效果 image

11:37:01.360 [main] INFO com.spring.component.easyexcel.listener.DemoDataListener - 读取到[Demo]的第9行记录:{"date":1589202943000,"no":"WEEK_3","num":0.6520999999999999,"zan":"点赞8"} 11:37:01.361 [main] INFO com.spring.component.easyexcel.listener.DemoDataListener - 读取到[Demo]的第10行记录:{"date":1589202943000,"no":"WEEK_4","num":0.74,"zan":"点赞9"}

建议 com.alibaba.excel.util.NumberUtils#parse 方法返回Number为BigDecimal对象,避免double、float等类型出现精度丢失的情况。 decimalFormat.setParseBigDecimal(true);

回答

4

非常感谢您的意见,已经在最新版修复。

1

使用最版本 easyexcel 3.3.2 ,导出字段类型为 BigDecimal ,并使用 @NumberFormat("#.##%")格式化 导出, 当字段值为 0.0 时 会被format成 .% ; 这个问题应该没有被修复

9

使用最版本 easyexcel 3.3.2 ,导出字段类型为 BigDecimal ,并使用 @numberformat("#.##%")格式化 导出, 当字段值为 0.0 时 会被format成 .% ; 这个问题应该没有被修复

你还没理解 format 用法 在注解中,需要指定数字的格式化规则,规则为字符串类型的参数。该参数应使用 # 和 0 两个字符来表示数字的占位符。

  • 表示有数字的地方显示数字,没有数字的地方显示空格
  • 0 表示有数字的地方显示数字,没有数字的地方补零

具体格式化规则可以参考 Java 中的 DecimalFormat 类。