【Bug】Apache POI 读取Excel小数补位问题

使用 Apache POI 读取导入的Excel的小数数据时,发现原本的小数值精度发生变化:

导入的是 0.6314,读取的却是 0.6314000000000001

导入的是 0.5207,读取的却是 0.5206999999999999

这种情况是 float数值转成double时增加补位的问题,要解决这个问题可以通过BigDecimal保留固定为小数,但不够准确,如果要将补位后的小数还原,则可以将其再转为float类型的数值即可:

java 复制代码
Cell cell = row.getCell(i);
double val = cell.getNumericCellValue();
String strVal = String.valueOf(val);
String decimalPart = strVal.substring(strVal.indexOf(".") + 1);
// 处理 float 类型转为 double后补0导致小数位不准确的情况(判断方法很粗暴)
BigDecimal newVal = null;
if (decimalPart.contains("00000") || decimalPart.contains("99999")) {
    Float floatVal = new Float(strVal);
    newValc = new BigDecimal(floatVal.toString());
} else {
    newVal = new BigDecimal(strVal);
}
相关推荐
温暖小土8 分钟前
深度解析 Spring Boot 自动配置:从原理到实践
java·springboot
Marktowin11 分钟前
Mybatis-Plus更新操作时的一个坑
java·后端
R-sz14 分钟前
如何将json行政区划导入数据库,中国行政区域数据(省市区县镇乡村五级联动)
java·数据库·json
定仙游45328 分钟前
Java StringBuilder 超详细讲解
java
haiyu柠檬30 分钟前
IDEA和VSCode中好用的插件推荐
java·vscode·intellij-idea
怜淇36 分钟前
docker拉取openjdk8:jre失败
java·docker·容器
降临-max1 小时前
JavaWeb企业级开发---Mybatis
java·开发语言·笔记·学习·mybatis
小妖6661 小时前
excel 本地sheet往服务器上粘贴时,表格宽度没有粘过来
excel
好好研究1 小时前
SpringBoot注解的作用
java·spring boot·spring
Libby博仙2 小时前
Spring Boot 条件化注解深度解析
java·spring boot·后端