【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);
}
相关推荐
tongyiixiaohuang几秒前
基于轻易云的数据集成,实现企业系统间灵活对接
java·前端·数据库
码农飞哥5 分钟前
从Java后端到AI应用开发,我这两年做了什么
java·开发语言·人工智能
森林猿10 分钟前
IDEA-控制台乱码
java·ide·intellij-idea
A-Jie-Y10 分钟前
JAVA设计模式-工厂方法模式
java·设计模式
千云16 分钟前
问题排查报告:一次因元空间溢出导致的CPU飙升与接口超时
java·后端
Full Stack Developme17 分钟前
MyBatis-Plus 注解教程
java·spring·mybatis
程序员三明治24 分钟前
【AI】Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析
java·开发语言·人工智能
2501_9130613434 分钟前
JVM虚拟机——面试中的八股文
java·jvm·面试
A-Jie-Y34 分钟前
JAVA设计模式-单例模式
java·设计模式
编程之升级打怪35 分钟前
设计模板引擎类的主要接口
java