这是一个家庭作业问题。我想编写一个函数将浮点数转换为一对整数:分子和分母。例如:float 0.5 应转换为(1,2)。
我正在尝试。 (见下文)但坦率地说,它对我来说看起来不太好。
// f is the input float
int n = 1
while(fractional_part(f) > 0)
f *= 10;
n++
int m = f;
gcd = gcd(m, n)
return (m/gcd, n/gcd)
如何将浮点数转换为分数?
你可以只使用分数库 http://docs.python.org/library/fractions.html.
但是,如果您想开发该算法,这里有一个建议:
from math import floor
from fractions import gcd
def func(v, tol=1e-4):
"""
Don't handle negative values.
Use binary search to find the fraction of a float.
The algorithm is based in a very simple theorem: If a < b then a < (a+b)/2 < b.
"""
f = v - floor(v)
lo = (0, 1)
hi = (1, 1)
while True:
# mid = (lo + hi)/2
# if lo = a/b and hi = c/d, then mid = (ad+bc)/(2ad)
mid = (lo[0]*hi[1] + hi[0]*lo[1], 2*lo[1]*hi[1])
# gcd to reduce fraction
k = gcd(mid[0], mid[1])
mid = (mid[0]/k, mid[1]/k)
d = 1.*mid[0]/mid[1]
# are we close enough?
if abs(f - d) < tol:
break
# if we are above our goal, get high to middle
elif d > f:
hi = mid
# if we are under our goal, get lower to middle
else:
lo = mid
# Add integer part
mid = (mid[0] + int(floor(v))*mid[1], mid[1])
# Debug comparing to Fraction library solution.
#print v, mid, Fraction('%s' % v)
return mid
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)