求助:编写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统计
你现有代码的问题
- 正则表达式错误:你使用的
split(/[^0+(\.?)0*|(~\.)0+$|\.]/)是取反匹配,实际会分割出所有非指定字符的片段,完全不符合有效数字的筛选逻辑;且原Java正则中的~在Groovy正则中是行尾匹配符,语法不兼容 - 循环边界错误:
i <= sig_figs.size()会导致数组越界(数组索引从0开始,最大索引为size()-1),正确应为i < sig_figs.size()
内容的提问来源于stack exchange,提问作者jrack11
相关产品推荐
相关产品推荐

