【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);
}
相关推荐
ArabySide10 分钟前
【Java】重构之善用多态解耦,记录一次模板方法实践
java·重构·模板方法模式
wanghowie16 分钟前
01.03 Java基础篇|面向对象核心与设计实践
java·开发语言
vortex521 分钟前
ORM是什么?如何理解ORM?ORM的优缺点?
java·数据库·sql·mysql·oracle·orm
Algebraaaaa23 分钟前
为什么线程阻塞要用.join而不是.wait
java·c++·python
是苏浙27 分钟前
零基础入门Java之设计图书管理系统
java·开发语言
墨雪不会编程33 分钟前
C++内存管理深度剖析
java·开发语言·c++
BBB努力学习程序设计36 分钟前
Java Scanner完全指南:让程序与用户对话
java
BBB努力学习程序设计39 分钟前
Java面向对象编程:封装、继承与多态深度解析
java
Lucky_Turtle42 分钟前
【Springboot】解决PageHelper在实体转Vo下出现total数据问题
java·spring boot·后端
Mr.朱鹏43 分钟前
大模型入门学习路径(Java开发者版)下
java·python·学习·微服务·langchain·大模型·llm