我正在研究Project Euler #26并需要计算小数部分。python计算小数部分为任意长度
使用Python,如何将1除以7并告诉函数只是给我小数部分,直到我从函数返回?
使用下面我可以一个小数部分的第17位:
from __future__ import division
1/7
# 0.14285714285714285
相反,我想编写一个函数,不会停止,直到我从它返回,并且这个功能只是不断生成小数部分。
我正在研究Project Euler #26并需要计算小数部分。python计算小数部分为任意长度
使用Python,如何将1除以7并告诉函数只是给我小数部分,直到我从函数返回?
使用下面我可以一个小数部分的第17位:
from __future__ import division
1/7
# 0.14285714285714285
相反,我想编写一个函数,不会停止,直到我从它返回,并且这个功能只是不断生成小数部分。
您可以生成的使用你在学校学到的方法相同数字的无限数量:长除法。只需从每个部门中取出剩余部分并将其移位一位数字(乘以10),然后除以得到新的余数。
def infinite_divide(numerator, denominator):
if numerator > denominator:
raise ValueError('This function only returns digits after the decimal')
while numerator != 0:
numerator *= 10
digit, numerator = divmod(numerator, denominator)
yield digit
下面是它在使用中的例子。我使用islice
将结果限制为50位,否则它会很乐意继续生成数字,直到内存用完。
>>> from itertools import islice
>>> '0.' + ''.join(str(digit) for digit in islice(infinite_divide(1, 7), 50))
'0.14285714285714285714285714285714285714285714285714'
对于Decimal这个特殊问题,这是一个更好的方法。留下我的回答,以防其他人在此登陆时有用,但这应该是公认的答案。 –
使用浮点格式不会在所有情况下正常工作,因为花车不能代表任意精确小数注释(如1/7应该是一个循环小数,但一段时间后,分解):
In [1]: print "%.50f"%(1.0/7)
0.14285714285714284921269268124888185411691665649414
可以代替使用Python内置的十进制获得任意精度:
In [2]: from decimal import Decimal, getcontext
In [3]: Decimal(1)/Decimal(7)
Out[3]: Decimal('0.1428571428571428571428571429')
In [4]: getcontext().prec = 100
In [5]: Decimal(1)/Decimal(7)
Out[5]: Decimal('0.1428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571429')
你的意思是这样:'打印 “%.50f” %(1.0/7)' – ZdaR
好极了!谢谢!完全有效。 – SeanPlusPlus