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

求助:编写Groovy函数计算整数的有效数字位数

解决方案:Groovy 实现有效数字位数统计

针对你的需求,这里提供一个基于基础字符串遍历的实现,避免复杂正则或不兼容语法,适配仅支持基础Groovy表达式的系统:

def countSignificantFigures(def mynum) {
    // 转换为字符串并去除正负号
    String numStr = mynum.toString().replaceAll(/^[+-]/, '')
    int sigCount = 0
    boolean foundNonZero = false
    boolean hasDecimalPoint = false

    // 遍历每个字符统计有效数字
    for (char c : numStr.toCharArray()) {
        if (c == '.') {
            hasDecimalPoint = true
            continue
        }

        if (c == '0') {
            // 非零数字之后的零才计入有效数字
            if (foundNonZero) {
                sigCount++
            }
        } else {
            // 非零数字直接计入,并标记已找到非零
            sigCount++
            foundNonZero = true
        }
    }

    // 处理全零的特殊情况(如0、0.0、000),有效数字为1
    if (!foundNonZero) {
        return 1
    }

    return sigCount
}

代码说明

  • 正负号处理:先用replaceAll去除数字开头的正负号,不影响有效数字统计
  • 遍历逻辑:
    • 遇到小数点仅标记,不计数
    • 前导零(未找到非零数字之前的零)不计入
    • 非零数字直接计数,并开启后续零的计数开关
    • 非零数字之后的所有零(无论小数点前后)均计入有效数字
  • 特殊情况处理:全零数字的有效数字统一按1统计

你现有代码的问题

  1. 正则表达式错误:你使用的split(/[^0+(\.?)0*|(~\.)0+$|\.]/)是取反匹配,实际会分割出所有非指定字符的片段,完全不符合有效数字的筛选逻辑;且原Java正则中的~在Groovy正则中是行尾匹配符,语法不兼容
  2. 循环边界错误:i <= sig_figs.size()会导致数组越界(数组索引从0开始,最大索引为size()-1),正确应为i < sig_figs.size()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:48:40