Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找小数点后的位数_Python_Performance - Fatal编程技术网

Python 查找小数点后的位数

Python 查找小数点后的位数,python,performance,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):

我试图编写一个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.4159

一,

二,

一百

14.159

十四,

三,

一千

141.59

141

四,

一万

1415.9

1415年

五,

十万

14159.0

14158

六,

一百万

141590.0

141589

七,

10000000

1415900.0

1415899

八,

100000000

14159000.0

14158999

九,

100000000

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


如何修改此代码以获得我们想要的结果?

以下是您可能喜欢的快捷方式:

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

这很有趣!因此,如果您运行以下命令:

x=3.14159
剩余=x-int(x)
印刷残留物
您将得到以下结果:

0.141589999988
这个小数实际上有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将其标识为整数为止(它也会按照您想要的次数向右移动)。您的代码实际上按照预期工作,在减法过程中发生了一些意想不到的事情。希望这有帮助

在您发布的代码中,您总是在第一次迭代中从循环返回。如果您想计算十进制数字,为什么不转换为字符串并计算呢?由于浮点精度问题,您的方法可能无法工作。这里的问题是由于浮点的存储方式而产生的舍入错误。浮点是以2为基数的,而不是以10为基数的,因此二进制表示中可能有一个非常小的重复数字不能正确地抵消。我能想到的唯一解决方案是替换
,而int(乘数*剩余)!=(乘数*剩余):
使用类似
的方法,而0.0000001<((乘数*剩余)-int(乘数*剩余)):
忽略细微的差异,但这不是一个很好的解决方案。tobias_k有一个比我好得多的解决方案。这为
x=1e-5
给出了错误的答案,在其他数字中,@MarkDickinson这是什么数字?你是说10美元吗?@SaaqibMahmuud:是的;这是
10**-5
的科学符号<点(1e-5)后的代码>数值将为零。@MarkDickinson但您可以输入与0.00001相同的数字,不是吗?那么DevShark的代码就行了,不是吗?您想如何改进他的代码?@SaaqibMahmuud:不,原来的解决方案在这种情况下不起作用
str(0.00001)
1e-05
。该方法在Python 2.5.4中不可用。该方法给出了“0.7576”的“5”,原因很简单,因为在第4次迭代时,
multiplier=10000
x*mulplier=7576.000000000001
。这可以通过从math import floor添加
,一个阈值
threshold=1e8
并使用
,而不是(floor(threshold*x*乘数)/threshold)来解决。is_integer():
同样,在使用此函数时遇到
0.0169
产生18,因为当
multiplier=10
时,它显示为
0.168999999998
。(耸耸肩)