Kotlin中如何移除小数末尾多余零实现大数字缩写格式化
问题原因
固定调用setScale(2, RoundingMode.HALF_EVEN)会强制保留两位小数,后续直接调用toString()时会把两位小数完整输出,自然会带上末尾无意义的0。
解决方案
使用BigDecimal内置的stripTrailingZeros()方法移除末尾多余的零,再调用toPlainString()转成普通字符串(避免整数值被转成科学计数法格式),就能自动处理末尾零和多余小数点的问题。
核心修改逻辑(以k单位分支为例,其余单位分支改法一致):
BigDecimal.valueOf(numb) .divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_EVEN) .stripTrailingZeros() .toPlainString() + "k"
优化点:把原来先转Double再构造BigDecimal的写法改成直接用Long值做BigDecimal除法,能避免Double类型自带的精度丢失问题,计算结果更准确。
完整修改后代码
private fun roundBigNumb(numb: Long): String { return when { numb in 1000..999994 -> { BigDecimal.valueOf(numb) .divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_EVEN) .stripTrailingZeros() .toPlainString() + "k" } numb in 999995..999999 -> { "999.99k" } numb in 1000000..999994999 -> { BigDecimal.valueOf(numb) .divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_EVEN) .stripTrailingZeros() .toPlainString() + "m" } numb in 999995000..999999999 -> { "999.99m" } numb in 1000000000..999994999999 -> { BigDecimal.valueOf(numb) .divide(BigDecimal.valueOf(1000000000), 2, RoundingMode.HALF_EVEN) .stripTrailingZeros() .toPlainString() + "b" } numb in 999995000000..999999999999 -> { "999.99b" } numb in 1000000000000..999994999999999 -> { BigDecimal.valueOf(numb) .divide(BigDecimal.valueOf(1000000000000), 2, RoundingMode.HALF_EVEN) .stripTrailingZeros() .toPlainString() + "t" } numb in 999995000000000..999999999999999 -> { "999.99t" } numb >= 1000000000000000 -> "∞" else -> numb.toString() } }
效果验证
- 输入11000:计算得11.00 → 移除尾零后为11 → 输出
11k,符合预期 - 输入11400:计算得11.40 → 移除尾零后为11.4 → 输出
11.4k,符合预期 - 输入2374293:计算得2.37 → 无多余尾零 → 输出
2.37m,符合预期
内容的提问来源于stack exchange,提问作者Zytron
相关产品推荐
相关产品推荐

