在计算机中,使用float存储小数并不精确,要得到精确的结果,最好使用分数形式来表达小数。小数具有两种类型,一种是有限小数,另一种是无线小数。比如:
0.9 = 9/10
0.333 (3) = 1/3
给定一个有限小数或者无线小数,希望以分母最小的分数形式返回这个小数。
对于以分母最小的分数形式返回这个小数有这样的定义:对于任意的一个分数A/B,可以简化为
其中Gcd函数为求A和B的最大公约数。
有限小数
对于有限小数来说,X就等于
import math
def Transform_1(str1):
return [len(str1)-2, int(str1[2:])]
num1 = "0.125"
[n,a] = Transform_1(num1)
A = a
B = 10**n
print(str(A//(math.gcd(A,B)) )+ '/' + str(B//(math.gcd(A,B))))
无限小数
对于无限小数,可以做如下替换
得到
令,那么
将Y代入前面的X等式中有
import math
def Transform_2(str2):
num = str2.split(' ')
return [len(num[0])-2, len(num[1])-2, int(num[0][2:]), int(num[1][1:-1])]
num2 = "0.285714 (285714)"
[n, m, a, b] = Transform_2(num2)
A = a*(10**m-1) + b
B = (10**m - 1)*(10**n)
print(str(A//(math.gcd(A,B)) )+ '/' + str(B//(math.gcd(A,B))))