【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);
}
相关推荐
我居然是兔子4 小时前
异常练习:在试错中吃透Java异常处理的底层逻辑
java·开发语言
CC.GG5 小时前
【C++】STL容器----unordered_map和unordered_set的使用
java·数据库·c++
Overt0p6 小时前
抽奖系统(4)
java·spring boot·tomcat
想做后端的小C7 小时前
Java:接口回调
java·开发语言·接口回调
爱学习的小可爱卢7 小时前
JavaEE进阶——Spring核心设计模式深度剖析
java·spring·设计模式
毕设源码-钟学长8 小时前
【开题答辩全过程】以 个性化电影推荐网站的设计与实现为例,包含答辩的问题和答案
java·spring boot
C++业余爱好者8 小时前
Power Job 快速搭建 及通信机制介绍
java
qq_2704900969 小时前
SpringBoot药品管理系统设计实现
java·spring boot·后端
、BeYourself9 小时前
SpringAI-ChatClient Fluent API 详解
java·后端·springai
星辰_mya9 小时前
reids哨兵集群与选主
java·开发语言