Python中整数的长度

在Python中,你如何find一个整数中的位数?

如果你想要一个整数的长度,就像整数中的数字一样,你总是可以把它转换成像str(133)这样的str(133)并且像len(str(123))那样find它的长度。

没有转换为string

 import math digits = int(math.log10(n))+1 

也处理零和负数

 import math if n > 0: digits = int(math.log10(n))+1 elif n == 0: digits = 1 else: digits = int(math.log10(-n))+2 # +1 if you don't count the '-' 

你可能想把它放在一个函数:)

这是一些基准。 len(str())已经落后了,甚至是很小的数字

 timeit math.log10(2**8) 1000000 loops, best of 3: 746 ns per loop timeit len(str(2**8)) 1000000 loops, best of 3: 1.1 µs per loop timeit math.log10(2**100) 1000000 loops, best of 3: 775 ns per loop timeit len(str(2**100)) 100000 loops, best of 3: 3.2 µs per loop timeit math.log10(2**10000) 1000000 loops, best of 3: 844 ns per loop timeit len(str(2**10000)) 100 loops, best of 3: 10.3 ms per loop 

Python 2.* int s取4或8个字节(32或64位),具体取决于您的Python构build。 sys.maxint (32位整数为2**31-1 sys.maxint位整数为2**63-1 )将告诉你两种可能性中的哪一种可能。

在Python 3中, int s(像Python 2中的long s)可以采用任意大小的可用内存量; sys.getsizeof给你一个很好的指示给任何给定的值,但它也计算一些固定的开销:

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

如果像其他答案所暗示的那样,你正在考虑整数值的一些string表示,那么就把这个expression式的len取为10,否则!

所有的math.log10解决scheme都会给你带来问题。

math.log10是快速的,但是当你的数字大于999999999999997时会出现问题。这是因为浮点数太多了.9s,导致了结果的四舍五入。

解决scheme是使用一个时间计数器方法来处理高于该阈值的数字。

为了使这个更快,创build10 ^ 16,10 ^ 17等等,并作为variables存储在列表中。 这样,就像查表一样。

 def getIntegerPlaces(theNumber): if theNumber <= 999999999999997: return int(math.log10(theNumber)) + 1 else: counter = 15 while theNumber >= 10**counter: counter += 1 return counter 

设数字为nn的位数由下式给出:

 math.floor(math.log10(n))+1 

请注意,这将为正整数<10e15给出正确的答案。 除此之外, math.log10的返回types的精度限制也可以是1.我只是简单地使用len(str(n)) ; 这需要O(log(n))时间,它与迭代10次幂相同。

感谢@SetiVolkylany将我的注意力带到这个限制。 它惊人的如何看似正确的解决scheme有执行细节的警告。

那么,不转换为string我会做这样的事情:

 def lenDigits(x): """ Assumes int(x) """ x = abs(x) if x < 10: return 1 return 1 + lenDigits(x / 10) 

极简主义recursionFTW

对于后代来说,毫无疑问,这是解决这个问题最慢的方法:

 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) 
 from math import log10 digits = lambda n: ((n==0) and 1) or int(log10(abs(n)))+1 

正如前面提到的亲爱的用户@Calvintwr,函数math.log10在范围[-999999999999997,9999999999999997]以外的数字中有问题,我们得到浮点错误。 我在JavaScript(Google V8和NodeJS)和C(GNU GCC编译器)中遇到了这个问题,所以这里'purely mathematically'解决scheme是不可能的。


基于这个要点和亲爱的用户@Calvintwr的答案

 import math def get_count_digits(number: int): """Return number of digits in a number.""" if number == 0: return 1 number = abs(number) if number <= 999999999999997: return math.floor(math.log10(number)) + 1 count = 0 while number: count += 1 number //= 10 return count 

我用长达20(含)的数字对它进行了testing。 它必须是足够的,因为64位系统上的最大整数长度是19( len(str(sys.maxsize)) == 19 )。

 assert get_count_digits(-99999999999999999999) == 20 assert get_count_digits(-10000000000000000000) == 20 assert get_count_digits(-9999999999999999999) == 19 assert get_count_digits(-1000000000000000000) == 19 assert get_count_digits(-999999999999999999) == 18 assert get_count_digits(-100000000000000000) == 18 assert get_count_digits(-99999999999999999) == 17 assert get_count_digits(-10000000000000000) == 17 assert get_count_digits(-9999999999999999) == 16 assert get_count_digits(-1000000000000000) == 16 assert get_count_digits(-999999999999999) == 15 assert get_count_digits(-100000000000000) == 15 assert get_count_digits(-99999999999999) == 14 assert get_count_digits(-10000000000000) == 14 assert get_count_digits(-9999999999999) == 13 assert get_count_digits(-1000000000000) == 13 assert get_count_digits(-999999999999) == 12 assert get_count_digits(-100000000000) == 12 assert get_count_digits(-99999999999) == 11 assert get_count_digits(-10000000000) == 11 assert get_count_digits(-9999999999) == 10 assert get_count_digits(-1000000000) == 10 assert get_count_digits(-999999999) == 9 assert get_count_digits(-100000000) == 9 assert get_count_digits(-99999999) == 8 assert get_count_digits(-10000000) == 8 assert get_count_digits(-9999999) == 7 assert get_count_digits(-1000000) == 7 assert get_count_digits(-999999) == 6 assert get_count_digits(-100000) == 6 assert get_count_digits(-99999) == 5 assert get_count_digits(-10000) == 5 assert get_count_digits(-9999) == 4 assert get_count_digits(-1000) == 4 assert get_count_digits(-999) == 3 assert get_count_digits(-100) == 3 assert get_count_digits(-99) == 2 assert get_count_digits(-10) == 2 assert get_count_digits(-9) == 1 assert get_count_digits(-1) == 1 assert get_count_digits(0) == 1 assert get_count_digits(1) == 1 assert get_count_digits(9) == 1 assert get_count_digits(10) == 2 assert get_count_digits(99) == 2 assert get_count_digits(100) == 3 assert get_count_digits(999) == 3 assert get_count_digits(1000) == 4 assert get_count_digits(9999) == 4 assert get_count_digits(10000) == 5 assert get_count_digits(99999) == 5 assert get_count_digits(100000) == 6 assert get_count_digits(999999) == 6 assert get_count_digits(1000000) == 7 assert get_count_digits(9999999) == 7 assert get_count_digits(10000000) == 8 assert get_count_digits(99999999) == 8 assert get_count_digits(100000000) == 9 assert get_count_digits(999999999) == 9 assert get_count_digits(1000000000) == 10 assert get_count_digits(9999999999) == 10 assert get_count_digits(10000000000) == 11 assert get_count_digits(99999999999) == 11 assert get_count_digits(100000000000) == 12 assert get_count_digits(999999999999) == 12 assert get_count_digits(1000000000000) == 13 assert get_count_digits(9999999999999) == 13 assert get_count_digits(10000000000000) == 14 assert get_count_digits(99999999999999) == 14 assert get_count_digits(100000000000000) == 15 assert get_count_digits(999999999999999) == 15 assert get_count_digits(1000000000000000) == 16 assert get_count_digits(9999999999999999) == 16 assert get_count_digits(10000000000000000) == 17 assert get_count_digits(99999999999999999) == 17 assert get_count_digits(100000000000000000) == 18 assert get_count_digits(999999999999999999) == 18 assert get_count_digits(1000000000000000000) == 19 assert get_count_digits(9999999999999999999) == 19 assert get_count_digits(10000000000000000000) == 20 assert get_count_digits(99999999999999999999) == 20 

所有使用Python 3.5testing的代码示例

假设您要求可以存储在一个整数中的最大数字,则该值取决于实现。 我build议你在使用python的时候不要这么想。 在任何情况下,相当大的值可以存储在一个python的“整数”。 请记住,Python使用鸭子打字!

编辑:我澄清之前给出了我的答案,提问者想要的位数。 为此,我同意接受答案所build议的方法。 没有更多的补充!

 def length(i): return len(str(i)) 

它可以快速完成使用:

 len(str(abs(1234567890))) 

其中获取“1234567890”的绝对值的string的长度

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

如果你希望它为浮动工作,你可以使用下面的任何一个:

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

备查。

 >>> a=12345 >>> a.__str__().__len__() 5