【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);
}
相关推荐
不会kao代码的小王3 分钟前
Linux 下 Tomcat 结合内网穿透 实现 Web 应用公网访问
java
ooseabiscuit8 分钟前
springboot下使用druid-spring-boot-starter
java·spring boot·后端
青衫码上行14 分钟前
【从零开始学习JVM】内存模型+堆栈的区别
java·jvm·学习·面试
迈巴赫车主14 分钟前
蓝桥杯 19717 挖矿java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
yaaakaaang15 分钟前
四、建造者模式
java·建造者模式
Sag_ever15 分钟前
Java String 类详解:字符串常用方法 + 不可变性 一网打尽
java·开发语言
2501_9216494916 分钟前
从WebSocket到SQL查询:金融数据落库存储及查询接口全流程开发
java·sql·websocket·程序人生·spring cloud·金融·系统架构
饺子大魔王的男人17 分钟前
Linux 下 Apache RocketMQ 部署与公网访问实现指南
linux·apache·rocketmq
jinanwuhuaguo19 分钟前
OpenClaw v2026.4.1 深度剖析报告:任务系统、协作生态与安全范式的全面跃迁
java·大数据·开发语言·人工智能·深度学习
Ada大侦探19 分钟前
Excel实现某一列特定选项进行筛选且配上特定颜色
excel