方法一:
public String formatBigDecimalToString(BigDecimal num) {
if (ObjectUtils.isEmpty(num)) {
return "";
}
// stripTrailingZeros():去除末尾无用的0;toPlainString():避免科学计数法
String numStr = num.stripTrailingZeros().toPlainString();
//处理特殊情况:整数形式的字符串(如"4.0"→"4")
if (numStr.contains(".0")) {
numStr = numStr.replace(".0", "");
}
return numStr;
}
方法二:
/**
- 扩展:先保留指定小数位,再去除末尾0 * @param num 待转换的BigDecimal * @param scale 保留的小数位数 * @return 格式化后的字符串 */
public static String formatBigDecimalToString(BigDecimal num, int scale) {
if (num == null) {
return "";
}
// 步骤1:保留指定小数位(四舍五
入)
BigDecimal scaledNum = num.setScale(scale, BigDecimal.ROUND_HALF_UP);
// 步骤2:去除末尾0 + 转普通字符串
String result = scaledNum.stripTrailingZeros().toPlainString(); // 步骤3:处理.0结尾
if (result.contains(".0")) {
result = result.replace(".0", "");
}
return result;
}
// 测试:保留2位小数后去0
public static void main(String[] args) { BigDecimal num = new BigDecimal("4.12300"); System.out.println(formatBigDecimalToString(num, 2)); // 输出:4.12
}
注意:
(1)实际执行,不执行
if (result.contains(".0")) {
result = result.replace(".0", "");
}
也能让4.0000得到"4"。
(2)BigDecimal 的「标度(scale)」是指:数值的小数部分的位数(简单说就是 "小数点后有几位")。
(3)stripTrailingZeros() 方法的核心逻辑是:去除小数部分末尾的 0,但会尽量保留 "最小的有效标度",而非直接把标度设为 0。
分步拆解 4.0000 的标度变化
原始值 new BigDecimal("4.0000"):
数值逻辑:4.0000
标度(scale):4(小数点后 4 位);
调用 stripTrailingZeros() 后:
方法会删除末尾的 0,但为了 "标识这是一个带小数的数值(而非纯整数)",会保留最小的有效标度 1;
结果:数值逻辑仍为 4,但标度变为 1 → 表现形式为 4.0;