【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);
}
相关推荐
ZePingPingZe12 分钟前
秒杀-库存超卖&流量削峰
java·分布式
horizon727416 分钟前
【Redis】Redis 分片集群搭建与故障转移实战指南
java·redis
想学后端的前端工程师17 分钟前
【Java设计模式实战应用指南:23种设计模式详解】
java·开发语言·设计模式
小白勇闯网安圈24 分钟前
Java的集合
java·开发语言
大学生资源网27 分钟前
基于springboot的乡村信息化管理系统的研究与实现(源码+文档)
java·spring boot·后端
鹿角片ljp29 分钟前
力扣 83: 删除排序链表中的重复元素(Java实现)
java·leetcode·链表
Mr Tang41 分钟前
Docker日志查看和应用日志查看命令大全
java·开发语言
invicinble42 分钟前
java处理数据合集
java·开发语言
Json_1 小时前
springboot框架对接物联网,配置TCP协议依赖,与设备通信,让TCP变的如此简单
java·后端·tcp/ip
C+++Python1 小时前
Java 锁机制
java·开发语言