easypoi解析excel出现的不明bug,数据精度丢失

easypoi解析excel出现的不明bug,数据精度丢失
引言
   收到反馈,通过excel导出的数据和导入的数据不一样,精度出现丢失。

如下图:

导入
在这里插入图片描述

导出

在这里插入图片描述

故障排查
  从数据录入,数据导出两方面进行排查,发现是录入的时候easy-poi解析出了问题(排查方式也很简单,查看数据库原始数据)
解决方案
方案一:从easy-poi中间件本身入手,在execl-->Object阶段进行校验
方案二:在Object-->Database阶段进行校验,观察错误数据得只需要进行简单的四舍五入操作即可。
能力有限,暂时选择了方案二。
具体解决:
 if 出现精度错误:
     进行四舍五入操作
为此封装了一个工具类
package cn.ickck.law_paper_final.utils;

import java.math.BigDecimal;



/**
 * @Author: ck
 * @Description:
 * @Date: Create in 15:13 2021/1/27
 */
public class RoundNoOfUtil {

    public static String RoundNoOf(String str, int scale) {
        try {
            // 输入精度小于0则抛出异常
            if (scale < 0) {
                throw new IllegalArgumentException("The scale must be a positive integer or zero");
            }

            // 取得数值
            BigDecimal b = new BigDecimal(str);
            // 取得数值1
            BigDecimal one = new BigDecimal("1");
            // 原始值除以1,保留scale位小数,进行四舍五入
            return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).toString();
        }catch (Exception e){
            e.printStackTrace();
        }
        return str;

    }
}

/*
     目前java支持7中舍入法:

1、 ROUND_UP:远离零方向舍入。向绝对值最大的方向舍入,只要舍弃位非0即进位。
2、 ROUND_DOWN:趋向零方向舍入。向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。
3、 ROUND_CEILING:向正无穷方向舍入。向正最大方向靠拢。若是正数,舍入行为类似于ROUND_UP,若为负数, 舍入行为类似于ROUND_DOWN。Math.round()方法就是使用的此模式。
4、 ROUND_FLOOR:向负无穷方向舍入。向负无穷方向靠拢。若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。
5、 HALF_UP:最近数字舍入(5进)。这是我们最经典的四舍五入。
6、 HALF_DOWN:最近数字舍入(5舍)。在这里5是要舍弃的。
7、 HAIL_EVEN:银行家舍入法。

 */

结语
  bug如何产生的还是摸不着头脑,强行加一层校验感觉有些治标不治本。
  后续任务:
  1.找出bug来源
  2.用反射机制进行校验操作,减少代码量

你可能感兴趣的:(Springboot,poi,java)