您的位置:首页 > 其它

循环小数转化为分数

2013-11-23 16:57 567 查看
众所周知循环小数是可以转化为分数的。

把循环小数转化为分数一般用极限的方法,比如0.33333........,可以看成是0.3+0.03+0.003+.......这个等比数列的值,然后求等比数列的和,设有n个数,则根据等比数列公式得和为0.3*(1-0.1^n)/(1-0.1),化简得(1-0.1^n)/3,n为无限多个,n趋于无穷大时的极值即为循环小数的值,注意了,这个极值就是循环小数的值,可不是无限接近循环小数的值,举一个特殊的循环小数0.99999.....,值就是1,因为它等于0.3333......乘以3,而0.33333.....等于1/3,1/3*3等于1,所以0.9999......值就是1。由于循环小数的公比肯定小于1,则化简后的等比数列的和,分子和分母一定是可以化为有限小数的,则分子分母都可以变为整数,这也证明了无限循环小数是可以转化为分数的。

观察一下循环小数(括号里为循环体)和分数:

0.33333...... = 3/9;

0.232323...(23) = 23/99

0.2345234523452345....(2345) = 2345/9999

0.1232323....(23) = 122/990

0.12343434...(34) = 1222/9900

……

你是否发现了一些规律,归纳如下:

循环小数0.abbbb......(a表示数字串,可以为空,b表示循环体),a的长度为m,b的长度为n,则化为分数如下:

(ab-a)/(9...)(0...),其中9有n个,0有m个。

如0.12345345345...(345) ,则a为12,b为345,ab为12345,m为2,n为3,则化为分数为(12345-12)/99900。

这里使用python3编程实现这个功能,代码如下:

def df2f(n, pos=-1):
"""把小数转换为分数,可以是循环小数,不可以是科学记数法表示的小数

@author: cidplp

@param n:输入小数,可以带整数部分
@type n:int或者float
@param pos:小数部分循环位置,从0开始,-1表示不循环
@type pos:int
@return:返回分子和分母
@rtype:int
"""

if isinstance(n, (float, int)) == False:
print('请输入正确的数字')
return None

part = str(n) #part是n的字符串样子
lpart, sep, rpart = part.partition('.') #lpart是整数部分,sep是小数点,rpart是小数部分

if sep == '':
return int(part), 1

if pos >= len(rpart):
print('循环小数位置错误')
return None

if pos == -1:
denominator = int('1'+'0'*len(rpart))
if int(lpart) >= 0:
numerator = denominator * int(lpart) + int(rpart)
else:
numerator = denominator * int(lpart) - int(rpart)
return numerator, denominator
else:
rlpart = rpart[0: pos] #小数的非循环部分
rrpart = rpart[pos:] #小数的循环部分

denominator = int('9'*len(rrpart)+'0'*len(rlpart))

if rlpart == '':
rlpart = '0'

if int(lpart) >= 0:
numerator = denominator * int(lpart) + int(rpart) - int(rlpart)
else:
numerator = denominator * int(lpart) - int(rpart) + int(rlpart)

return numerator, denominator
这样算出来的结果不一定是最简的,如果化简的话使用下面函数约分:
def redu(numerator, denominator):
"""分数约分,如果分子分母有小数,则都变为整数后约分

@author: cidplp

@param numerator:分子
@type numerator:int或float
@param denominator:分母
@type denominator:int或float
@return:约分后分子和分母
@rtype:int
"""

a = numerator
b = denominator

if isinstance(a, (int, float)) == False or isinstance(b, (int, float)) == False:
print('请输入正确的数字')
return None

if b == 0:
print('分母不能为零')
return None

#把a,b化为分数
t1 = df2f(a)
t2 = df2f(b)

#两分数相乘,分子赋值给a,分母赋值给b
a = t1[0] * t2[1]
b = t1[1] * t2[0]

#判断a和b是否有负数
if abs(a+b) == abs(a) + abs(b):
flag = 1
else:
flag = -1

a = abs(int(a))
b = abs(int(b))

temp = max(a, b)

i = 2
while i <= min(a, b):
if a % i == 0 and b % i == 0:
a //= i
b //= i
else:
i += 1
return a*flag, b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: