使用 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);
}