Python自定义digits函数用while n>0统计位数返回异常值的原因
问题原因分析
核心原因:误用了浮点数除法
Python3中/运算符执行的是浮点数除法,而非截断小数的整数除法,你代码中每次执行n = n / 10都会得到浮点数结果,而非整数。
比如输入25时,循环执行过程是:
- 第一次循环:count=1,n=25/10=2.5,仍满足
n>0 - 第二次循环:count=2,n=2.5/10=0.25,仍满足
n>0 - 后续循环:n会变成0.025、0.0025……这类始终大于0的极小浮点数,循环不会终止,直到浮点数精度耗尽,n最终变为0.0才会退出,此时count已经累计到300多的异常值。
为什么改n>1看起来能正常运行?
当循环条件改成n>1时,n降到1以下就会退出:
还是拿25举例,第二次循环后n=0.25,不满足n>1直接退出,count刚好是2,和预期结果一致,属于歪打正着。
但这个解法存在漏洞:比如输入1时,初始n=1不满足n>1,会直接返回count=0,和预期的1位不符。
正确修复方案
把浮点数除法换成整数除法//,保留原来的n>0循环条件即可:
def digits(n): count = 0 if n == 0: return 1 while (n > 0): count += 1 n = n // 10 return count
这个写法可以正确覆盖所有正整数的位数统计场景。
内容的提问来源于stack exchange,提问作者Annie
相关产品推荐
相关产品推荐

