3 回答
TA贡献1809条经验 获得超8个赞
不转换为字符串
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
TA贡献1783条经验 获得超4个赞
所有math.log10解决方案都会给您带来问题。
math.log10速度很快,但是当您的数字大于999999999999997时会出现问题。这是因为float的.9s太多,导致结果四舍五入。
解决方案是对大于该阈值的数字使用while计数器方法。
为了使其更快,请创建10 ^ 16、10 ^ 17,依此类推,并作为变量存储在列表中。这样,它就像一个表查找。
def getIntegerPlaces(theNumber):
if theNumber <= 999999999999997:
return int(math.log10(theNumber)) + 1
else:
counter = 15
while theNumber >= 10**counter:
counter += 1
return counter
添加回答
举报