poi导出的excel的数字小数位过多?

时间:2022-04-16 10:24:42

  最近在使用Apache的POI组件对Excel进行操作,在对excel导出的时候,导出的数字本来只有两位小数,得到的结果就变成了很多位小数。如下面的图所示:

poi导出的excel的数字小数位过多?

  虽然对单元格使用了setCellStyle,但还是治标不治本,显示虽然是只显示两位小数了,但是点开还是有很长的一串小数位,这很不爽,这什么原因导致的呢?我们来看看。

  我首先debug看一下,在设置单元格的值时候,数据一切正常,数据库读出的数据也为0.44,没看出一点猫腻。随后我再仔细看看,在看到cell.setCellValue(double arg0)里面的参数是double的时候,感觉到一点不对劲,再看看Model,发现该成员变量是float,敏感的同学应该一眼就看出来了,没错,就是float转double的时候精度变得更细了。

  关于float和double的关系,我推荐看一下这个文章:float浮点数的二进制存储方式及转换。大概就是double比float拥有更长的指数位和尾数位,在指数位不影响的情况下,float的数值转化为二进制数值的时候,小数乘以2的时候无法得出1,导致尾数位是无限的01,而double拥有更长的尾数位,所以double的01比float更多,得出的结果也就不一样,也就是说double比float的精度更精确。

  那么怎么解决这个问题呢?其实就是float转double的精度问题,

  1、将Model的成员变量改为double。(不干,太麻烦,还要改数据库什么的)

  2、使用BigDecimal的setScale

  3、Double.parseDouble(String.valueOf(number))