在Python中,如何找到整数中的位数?


当前回答

from math import log10
digits = lambda n: ((n==0) and 1) or int(log10(abs(n)))+1

其他回答

Python 2。* int需要4或8字节(32或64位),这取决于你的Python版本。sys。Maxint(2**31-1用于32位int, 2**63-1用于64位int)将告诉您两种可能性中哪一种获得。

在Python 3中,int(就像Python 2中的long)可以取任意大小,直到可用内存的数量;sys。Getsizeof为任何给定值提供了一个很好的指示,尽管它也计算了一些固定开销:

>>> import sys
>>> sys.getsizeof(0)
12
>>> sys.getsizeof(2**99)
28

如果像其他答案所建议的那样,您正在考虑整数值的某个字符串表示,那么只需取该表示的len,以10为基底或以其他方式!

对于子孙后代来说,这无疑是迄今为止解决这个问题最慢的方法:

def num_digits(num, number_of_calls=1):
    "Returns the number of digits of an integer num."
    if num == 0 or num == -1:
        return 1 if number_of_calls == 1 else 0
    else:
        return 1 + num_digits(num/10, number_of_calls+1)

顶部的答案是说mathlog10更快,但我得到的结果表明len(str(n))更快。

arr = []
for i in range(5000000):
    arr.append(random.randint(0,12345678901234567890))
%%timeit

for n in arr:
    len(str(n))
//2.72 s ± 304 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit

for n in arr:
    int(math.log10(n))+1
//3.13 s ± 545 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

此外,我没有在数学方法中添加逻辑来返回准确的结果,我只能想象这会使它更加缓慢。

我不知道之前的答案是如何证明数学方法更快的。

对于整数,可以使用以下方法快速完成:

len(str(abs(1234567890)))

获取"1234567890"的绝对值的字符串长度。

abs返回没有任何负号的数字(只有数字的大小),str将其转换为字符串,len返回该字符串的字符串长度。

如果你想让它为浮点数工作,你可以使用以下任何一个:

# Ignore all after decimal place
len(str(abs(0.1234567890)).split(".")[0])

# Ignore just the decimal place
len(str(abs(0.1234567890)))-1

供以后参考。

coin_digit = str(coin_fark).split(".")[1]
coin_digit_len = len(coin_digit)
print(coin_digit_len)