当前位置:   article > 正文

循环小数转化为分数_python将小于1的循环小数转换成分数

python将小于1的循环小数转换成分数

众所周知循环小数是可以转化为分数的。

把循环小数转化为分数一般用极限的方法,比如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编程实现这个功能,代码如下:

  1. def df2f(n, pos=-1):
  2. """把小数转换为分数,可以是循环小数,不可以是科学记数法表示的小数
  3. @author: cidplp
  4. @param n:输入小数,可以带整数部分
  5. @type n:int或者float
  6. @param pos:小数部分循环位置,从0开始,-1表示不循环
  7. @type pos:int
  8. @return:返回分子和分母
  9. @rtype:int
  10. """
  11. if isinstance(n, (float, int)) == False:
  12. print('请输入正确的数字')
  13. return None
  14. part = str(n) #part是n的字符串样子
  15. lpart, sep, rpart = part.partition('.') #lpart是整数部分,sep是小数点,rpart是小数部分
  16. if sep == '':
  17. return int(part), 1
  18. if pos >= len(rpart):
  19. print('循环小数位置错误')
  20. return None
  21. if pos == -1:
  22. denominator = int('1'+'0'*len(rpart))
  23. if int(lpart) >= 0:
  24. numerator = denominator * int(lpart) + int(rpart)
  25. else:
  26. numerator = denominator * int(lpart) - int(rpart)
  27. return numerator, denominator
  28. else:
  29. rlpart = rpart[0: pos] #小数的非循环部分
  30. rrpart = rpart[pos:] #小数的循环部分
  31. denominator = int('9'*len(rrpart)+'0'*len(rlpart))
  32. if rlpart == '':
  33. rlpart = '0'
  34. if int(lpart) >= 0:
  35. numerator = denominator * int(lpart) + int(rpart) - int(rlpart)
  36. else:
  37. numerator = denominator * int(lpart) - int(rpart) + int(rlpart)
  38. return numerator, denominator
这样算出来的结果不一定是最简的,如果化简的话使用下面函数约分:

  1. def redu(numerator, denominator):
  2. """分数约分,如果分子分母有小数,则都变为整数后约分
  3. @author: cidplp
  4. @param numerator:分子
  5. @type numerator:int或float
  6. @param denominator:分母
  7. @type denominator:int或float
  8. @return:约分后分子和分母
  9. @rtype:int
  10. """
  11. a = numerator
  12. b = denominator
  13. if isinstance(a, (int, float)) == False or isinstance(b, (int, float)) == False:
  14. print('请输入正确的数字')
  15. return None
  16. if b == 0:
  17. print('分母不能为零')
  18. return None
  19. #把a,b化为分数
  20. t1 = df2f(a)
  21. t2 = df2f(b)
  22. #两分数相乘,分子赋值给a,分母赋值给b
  23. a = t1[0] * t2[1]
  24. b = t1[1] * t2[0]
  25. #判断a和b是否有负数
  26. if abs(a+b) == abs(a) + abs(b):
  27. flag = 1
  28. else:
  29. flag = -1
  30. a = abs(int(a))
  31. b = abs(int(b))
  32. temp = max(a, b)
  33. i = 2
  34. while i <= min(a, b):
  35. if a % i == 0 and b % i == 0:
  36. a //= i
  37. b //= i
  38. else:
  39. i += 1
  40. return a*flag, b



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/195134
推荐阅读
相关标签
  

闽ICP备14008679号