找出小数点后的数字个数。

5

我正在尝试编写一个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循环内的打印语句仅用于调试目的。

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

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

1000000

141590.0

141589

7

10000000

1415900.0

1415899

8

100000000

14159000.0

14158999

9

1000000000

....

这个函数返回的count的最终值为17。

如何修改这段代码以实现我们想要的结果?


在您发布的代码中,您总是在第一次迭代中从循环中返回。 - tobias_k
4
如果你想要计算小数位数,为什么不直接转换成字符串然后计数呢?由于浮点精度问题,你的方法可能不起作用。 - tobias_k
tobias_k的解决方案比我的好得多。 - Kyle A
3
计算浮点数中小数位数的方法。给定一个浮点数,例如3.14159或2.71828,如何计算其小数部分的位数?换句话说,有多少个数字在小数点后面?例如,对于3.14159,答案是5。对于2.71828,答案是5。 - Padraic Cunningham
1
这个回答解决了你的问题吗?查找小数位的简单方法 - eadmaster
显示剩余2条评论
4个回答

6

这里有一个你可能会喜欢的快捷方式:

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

1
这会给出错误的答案,对于 x=1e-5 和其他一些数字。 - Mark Dickinson
@MarkDickinson 这是什么数字?你是指 $10^{-5}$ 吗? - Saaqib Mahmood
@SaaqibMahmuud:是的,这是科学计数法表示的10**-5num_after_point(1e-5)将返回零。 - Mark Dickinson
我已经添加了解决方案来解决这个问题。 - DevShark
1
@SaaqibMahmuud:不,原本的解决方案在这种情况下不起作用。str(0.00001)1e-05 - Mark Dickinson
显示剩余4条评论

3
这很有趣!如果你运行以下命令:
x = 3.14159  
residue = x - int(x)  
print residue  

您将获得以下结果:
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 将其识别为整数(它将向右移动您想要的次数)。您的代码实际上按照您的意图工作,只是在减法过程中发生了一些意外情况。希望这可以帮到您!


在Python 2.5.4中,is_integer方法不可用。 - Saaqib Mahmood
这个方法对于输入的 "0.7576" 返回了 "5",这是因为在第四次迭代时,multiplier = 10000 并且 x * mulplier = 7576.000000000001。可以通过添加 from math import floor,一个阈值 threshold=1e8 并使用 while not (floor(threshold*x*multiplier)/threshold).is_integer(): 来解决这个问题。 - Shadi
刚刚用这个函数运行了一下,发现当multiplier=10时,结果为0.16899999999999998,而不是0.0169。无语。 - Shadi
number_of_digits_post_decimal(32.91647)返回15而不是5。 - Johny White

0
def precision(f):
    integer, remainder = str(f).split('.')
    return len(remainder)

如果f是整数,则出现错误。 - iperov

0
def decimal_places(f):
    exp = -1
    remainder = True
    while remainder:
        exp += 1
        a = f * 10**exp
        remainder = int(a) - a
    return(exp)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接