Java处理Oracle NUMBER(15,5)查询结果整数被强制转小数问题
问题处理方案
不需要结合precision参数处理,该参数代表列的总有效数字长度,你从ResultSet中取出的BigDecimal本身已经符合列的精度约束,做输出格式适配时不需要用到这个值。
问题根源
现有逻辑直接调用setScale(scale)会强制将数值的小数位补全到列定义的固定长度,即使小数位全是无意义的尾部0,所以整数2000会被格式化为2000.00000。
合规处理逻辑
处理流程只需要3步,完全适配NUMBER(15,5)这类带固定小数位的数值列输出要求:
- 按列定义的
scale对原始值做舍入(需显式指定舍入模式,避免无舍入模式时小数位超长抛出异常,日常业务场景常用RoundingMode.HALF_UP即四舍五入),保证小数位不超过列定义的最大长度 - 调用
stripTrailingZeros()移除小数位末尾无意义的0 - 处理特殊边界:如果移除尾部0后数值末尾是小数点(即值为整数),将小数点一并去除,避免输出
2000.这类不符合阅读习惯的格式
修正后代码
String cellData; case Types.DECIMAL: BigDecimal number = rs.getBigDecimal(i); if (number != null) { int scale = rsMetadata.getScale(i); // 按列定义的最大小数位做舍入,适配业务常用四舍五入规则 cellData = number.setScale(scale, RoundingMode.HALF_UP) .stripTrailingZeros() .toPlainString(); // 处理整数场景下末尾遗留的小数点 if (cellData.endsWith(".")) { cellData = cellData.substring(0, cellData.length() - 1); } }
效果验证
针对NUMBER(15,5)列的各类场景输出完全符合预期:
- 存储值为2000:输出
2000 - 存储值为123.45:输出
123.45 - 存储值为1.234567:按5位小数四舍五入后输出
1.23457 - 存储值为0.00100:输出
0.001
注意:如果你的业务场景不需要四舍五入,而是要求直接截断超长小数位,可以把舍入模式替换为
RoundingMode.DOWN即可。
内容的提问来源于stack exchange,提问作者elads11
相关产品推荐
相关产品推荐

