计算第一个非0数之前的十进制小数位数的最有效方法是什么?
所需结果:
0.0000456 ---> 4
0.00406 ---> 2
0.000456 ---> 3
到目前为止,我已经从数学上对此进行了尝试(这很慢):
from math import floor, log
def num_zeros(decimal):
return 10 - floor(log(decimal *10e10,10))
,并且此值(第一个数字后不等于0):
def count_0(number):
n = format(number, 'f').count('0')
return n - 1
答案 0 :(得分:1)
这是使用regular expression处理此问题的一种方法:
# Update, simplified sol thanks to @Aran-Fey's comments
import re
s = '0.0000456'
len(re.search('\d+\.(0*)', s).group(1))
#4
答案 1 :(得分:1)
您可以执行以下操作:
def num_of_zeros(n):
s = '{:.16f}'.format(n).split('.')[1]
return len(s) - len(s.lstrip('0'))
print(num_of_zeros(0.0000456)) # ==> 4
print(num_of_zeros(0.00406)) # ==> 2
print(num_of_zeros(0.000456)) # ==> 3
答案 2 :(得分:1)
好吧,我这样做的话...如果可以的话...
def count_zero_in_decimal_number(number):
zeros = 0
while number < 0.1:
number *= 10
zeros += 1
return zeros
通常,我不喜欢在 while 语句中使用它,但是它确实可以工作。我已经通过您的示例对其进行了测试。
答案 3 :(得分:0)
您可以使用numpy对您给定的log方法进行矢量化处理。这样可以大大加快速度。
import numpy as np
def num_zeros(decimal_vec):
return np.floor(np.abs(np.log10(decimal_vec)))
input_arr = np.array([0.0000456,0.00406,0.000456])
print(num_zeros(input_arr)) #--> [4. 2. 3.]
答案 4 :(得分:0)
这可能不是确切的解决方案,但可以帮助您使用其他十进制数字。只需一行即可。
n = '12.11000000'
count = len(n) - len(n.rstrip('0'))
print (count)
答案 5 :(得分:0)
def get_num_of_zeros(num):
if not num:
return 0
current_num = abs(num)
num_of_zeros = -1
while not (current_num//1):
current_num *= 10
num_of_zeros +=1
return num_of_zeros