如何计算小数点后的零个数?

时间:2019-03-07 16:40:56

标签: python

计算第一个非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

6 个答案:

答案 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