【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);
}
相关推荐
codergjw7 小时前
常见面试题
java
咕噜企业分发小米7 小时前
如何平衡服务器内存使用率和系统稳定性?
java·服务器·前端
李子园的李7 小时前
函数式编程与传统编程的对比——基于java
java
爬山算法7 小时前
Netty(13)Netty中的事件和回调机制
java·前端·算法
南极企鹅8 小时前
Gson转义特殊字符
java
Mr_Xuhhh8 小时前
第一部分:类和对象(中)— 取地址运算符重载
java·开发语言
Selegant8 小时前
告别传统部署:用 GraalVM Native Image 构建秒级启动的 Java 微服务
java·开发语言·微服务·云原生·架构
__万波__8 小时前
二十三种设计模式(十三)--模板方法模式
java·设计模式·模板方法模式
动亦定8 小时前
微服务中如何保证数据一致性?
java·数据库·微服务·架构