Python 返回未约化分数的分数函数

Python 返回未约化分数的分数函数,python,python-3.x,fractions,Python,Python 3.x,Fractions,我想把一个数学表达式转换成一个小分数。当使用分数模块中的分数函数时,我得到一个未减少的分数 代码 from fractions import Fraction print(Fraction(1 + 1/(2 + 1/2))) 返回3152519739159347/2251799813685248,该值减少为7/5 我希望我的代码返回减少的分数。如果你想处理分数,你需要执行精确数学中的所有运算,而不仅仅是在最后转换成分数。这意味着不能将ints除以ints,这会给你一个浮点值 from fra

我想把一个数学表达式转换成一个小分数。当使用分数模块中的分数函数时,我得到一个未减少的分数

代码

from fractions import Fraction

print(Fraction(1 + 1/(2 + 1/2)))

返回
3152519739159347/2251799813685248
,该值减少为
7/5


我希望我的代码返回减少的分数。

如果你想处理分数,你需要执行精确数学中的所有运算,而不仅仅是在最后转换成分数。这意味着不能将
int
s除以
int
s,这会给你一个浮点值

from fractions import Fraction as F

1 + F(1, 2 + F(1, 2))
# or, taking advantage of how int/Fraction gives a Fraction,
1 + 1/(2 + F(1, 2))

否则,浮点舍入将导致精度下降,并且您将不得不使用诸如使用
限制\u分母
等选项来猜测未舍入的结果可能是什么。

这是由于浮点数学的不精确性

虽然
1+1/(2+1/2)
应该减少到
7/5
(或
1.4
),但小数
1.4
不能用浮点数精确表示

>>> '{:030f}'.format(1.4)
1.39999999999999999999911182158029987
这种不准确导致它产生了与
7/5


如果你想要精确的分数数学,你需要用分数来计算整个方程,而不是把它和浮点数混在一起。

3152519739159347/2251799813685248并没有减少到7/5。你是在用不精确的浮点建立分数-不要这样做。如果你想做分数数学,你需要从一开始就使用
分数
,在所有的数学运算都已经用浮点数完成之后就不会了。
3152519739159347*5-7*2251799813685248
->
-1
@asgarth:计算器的精度有限。(另外,你真的需要学习算术原理,而不仅仅是如何使用计算器。2251799813685248不以0或5结尾,因此它不是5的倍数,以2251799813685248为分母的分数不能简化为5的分母。)
1+F(1,2+F(1,2))
已经是
分数了,您不需要再将其发送到
F
您也可以执行
F(1)/2
F('1/2')
来获得比
F(1,2)
更可读的内容。