【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);
}
相关推荐
吃喝不愁霸王餐APP开发者5 分钟前
外卖API对接过程中时间戳与时区处理的最佳实践(避免核销失效)
java
抹除不掉的轻狂丶13 分钟前
Java 日志框架完整指南:发展历史、核心组成与最佳实践
java·开发语言·python
林涧泣24 分钟前
使用Java输出HelloWorld
java·开发语言
叫致寒吧35 分钟前
Dockerfile
java·spring cloud·eureka
鸽鸽程序猿42 分钟前
【刷题册】三
java·刷题
ruleslol44 分钟前
java中调用uri请求的几种常见的方法
java
资生算法程序员_畅想家_剑魔44 分钟前
Java常见技术分享-10-装饰器模式
java·开发语言·装饰器模式
ss2731 小时前
ThreadPoolExecutor七大核心参数:从源码看线程池的设计
java·数据库·算法
林shir1 小时前
Java基础1.4-运算符
java·开发语言