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 } }
当前方案的问题
- 精度隐患:
toString().toDouble()的转换逻辑可能触发科学计数法(比如极小/极大的Double值),导致后续处理失效; - 判断不可靠:
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
相关产品推荐
相关产品推荐

