查找小数点后的位数

时间:2016-02-23 19:01:49

标签: python performance

我正在尝试编写一个Python 2.5.4代码来编写一个函数,该函数将浮点数x作为输入,并返回x中小数点后的位数。

这是我的代码:

def number_of_digits_post_decimal(x):
    count = 0
    residue = x -int(x)
    if residue != 0:
        multiplier = 1
        while int(multiplier * residue) != (multiplier * residue):
            count += 1
            multiplier = 10 * multiplier
            print count
            print multiplier
            print multiplier * residue
            print int(multiplier * residue)
            return count

print number_of_digits_post_decimal(3.14159)

while循环中的print语句仅用于调试目的。

现在,当我运行此代码时,我得到以下输出。

  

1

     

10

     

1.4159

     

1

     

2

     

100

     

14.159

     

14

     

3

     

1000

     

141.59

     

141

     

4

     

10000

     

1415.9

     

1415

     

5

     

100000

     

14159.0

     

14158

     

6

     

百万

     

141590.0

     

141589

     

7

     

千万

     

1415900.0

     

1415899

     

8

     

亿

     

14159000.0

     

14158999

     

9

     

十亿

     

...

此函数返回的count的最终值为17.

如何修改此代码以达到我们想要的效果?

2 个答案:

答案 0 :(得分:2)

这是您可能喜欢的捷径:

def num_after_point(x):
    s = str(x)
    if not '.' in s:
        return 0
    return len(s) - s.index('.') - 1

答案 1 :(得分:2)

这很有意思!因此,如果您运行以下内容:

x = 3.14159
residue = x - int(x)
印刷残留物

您将获得以下结果:

0.14158999999999988

这个小数实际上有17位数。我发现覆盖它的唯一方法是避免进行减法(这是错误的根本原因,你可以从这里的不准确看到)。因此,此代码应该按预期工作:

def number_of_digits_post_decimal(x):  
    count = 0  
    residue = x -int(x)  
    if residue != 0:  
        multiplier = 1  
        while not (x*multiplier).is_integer():  
            count += 1  
            multiplier = 10 * multiplier  
        return count

这只会将小数点向右移动,直到python将其标识为一个整数(它将向右移动完全符合你想要的次数)。你的代码实际上按照你的意图工作,在减法过程中发生了一些无意的事情。希望这有帮助!