You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:03:18