【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);
}
相关推荐
鱼鳞_3 分钟前
Java学习笔记_Day22
java·笔记·学习
__土块__23 分钟前
一次电商秒杀系统架构评审:从本地锁到分布式锁的演进与取舍
java·redis·高并发·分布式锁·redisson·架构设计·秒杀系统
她说..28 分钟前
Java 注解核心面试题
java·spring boot·spring·spring cloud·自定义注解
用户83071968408228 分钟前
Spring Boot @Qualifier深度解密:从“按名查找”到“分组批量注入”,一文掌握它的全部“隐藏技能”。
java·spring boot
亦暖筑序35 分钟前
Message 四分天下:Spring AI 如何统一消息格式
java·人工智能
镜花水月linyi40 分钟前
JDK 8 → 17 → 21 → 25:一次性讲清四代版本的关键跃迁
java·后端
0xDevNull1 小时前
JDK 25 新特性概览与实战教程
java·开发语言·后端
Yiyi_Coding1 小时前
BUG列表:如何定位线上 OOM ?
java·linux·bug
gelald1 小时前
Spring - 循环依赖
java·后端·spring
凤山老林1 小时前
Java 开发者零成本构建 RAG 知识库:Spring AI Alibaba + Ollama 搭建本地 RAG 知识库
java·人工智能·知识库·rag·spring ai