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

Kotlin中如何去除Double类型末尾无效零?求实现方案

Kotlin中去除Double末尾多余零的实现方案

问题描述

需要打印多个不同小数位数的Double数值,自动去除末尾多余的零,示例需求如下:

  • 输入1.23 → 输出1.23
  • 输入0.330 → 输出0.33
  • 输入1.00 → 输出1
  • 输入1.001 → 输出1.001

当前自行实现的代码如下:

fun Double.roundToLastDecimal(): Number {
    val num = this.toString().toDouble()
    return if (num % 1 == 0.0) {
        num.toInt()
    } else {
        num
    }
}

当前方案的问题

  1. 精度隐患:toString().toDouble()的转换逻辑可能触发科学计数法(比如极小/极大的Double值),导致后续处理失效;
  2. 判断不可靠:num % 1 == 0.0的浮点判断可能因为Double的精度误差出现错误,比如某些接近整数的数值会被误判。

可行解决方案

方案一:使用DecimalFormat格式化(简单稳定)

借助Java的DecimalFormat可以直接配置格式规则,自动处理末尾零和多余小数点:

import java.text.DecimalFormat

fun Double.trimTrailingZeros(): String {
    // 0表示必须存在的数字,#表示可选数字,最多保留10位小数可按需调整
    val formatter = DecimalFormat("0.##########")
    return formatter.format(this)
}

测试验证:

  • 1.23.trimTrailingZeros() → "1.23"
  • 0.330.trimTrailingZeros() → "0.33"
  • 1.00.trimTrailingZeros() → "1"
  • 1.001.trimTrailingZeros() → "1.001"

方案二:纯Kotlin字符串处理(无依赖)

通过正则表达式直接操作字符串,去除末尾零和多余小数点:

fun Double.trimTrailingZeros(): String {
    val rawStr = this.toString()
    return if (rawStr.contains('.')) {
        // 先去掉末尾所有零,再去掉可能遗留的小数点
        rawStr.replace(Regex("0+$"), "").replace(Regex("\\.$"), "")
    } else {
        rawStr
    }
}

注意:如果你的场景中会出现科学计数法表示的Double值(如1e-5),需要额外添加逻辑将其转换为普通十进制字符串后再处理。

总结

Kotlin没有原生语法直接实现该需求,但上述两种方案都能稳定满足你的要求,相比当前实现,它们规避了浮点精度和格式转换的潜在问题。

内容的提问来源于stack exchange,提问作者meleduck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:30:46