【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);
}
相关推荐
beata40 分钟前
Java基础-13: Java反射机制详解:原理、使用与实战示例
java·后端
用户03321266636744 分钟前
Java 使用 Spire.Presentation 在 PowerPoint 中添加或删除表格行与列
java
Seven973 小时前
Condition底层机制剖析:多线程等待与通知机制
java
怒放吧德德12 小时前
Spring Boot 实战:RSA+AES 接口全链路加解密(防篡改 / 防重放)
java·spring boot·后端
郑州光合科技余经理16 小时前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
大大水瓶16 小时前
Tomcat
java·tomcat
dustcell.16 小时前
haproxy七层代理
java·开发语言·前端
游离态指针16 小时前
以为发消息=下单成功?RabbitMQ从0到秒杀实战的完整踩坑笔记
java
BD_Marathon17 小时前
工厂方法模式
android·java·工厂方法模式
玹外之音17 小时前
Spring AI MCP 无状态服务器实战:构建AI智能用户管理系统
java·后端