【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);
}
相关推荐
吴声子夜歌3 小时前
Java数据结构与算法——基本数学问题
java·开发语言·windows
_UMR_3 小时前
springboot集成Jasypt实现配置文件启动时自动解密-ENC
java·spring boot·后端
程序员小假4 小时前
我们来说说 Cookie、Session、Token、JWT
java·后端
短剑重铸之日4 小时前
《SpringBoot4.0初识》第一篇:前瞻与思想
java·开发语言·后端·spring·springboot4.0
蓝色王者4 小时前
springboot 2.6.13 整合flowable6.8.1
java·spring boot·后端
Tao____4 小时前
基于Ruoyi开发的IOT物联网平台
java·网络·物联网·mqtt·网络协议
花哥码天下5 小时前
apifox登录后设置token到环境变量
java·后端
浩瀚地学5 小时前
【Java】常用API(二)
java·开发语言·经验分享·笔记·学习
hashiqimiya6 小时前
springboot事务触发滚动与不滚蛋
java·spring boot·后端