我正在尝试编写一个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.
如何修改此代码以达到我们想要的效果?
答案 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将其标识为一个整数(它将向右移动完全符合你想要的次数)。你的代码实际上按照你的意图工作,在减法过程中发生了一些无意的事情。希望这有帮助!