分数函数返回未减少的分数

时间:2018-05-04 22:02:17

标签: python python-3.x fractions

我试图将数学表达式转换为减少的分数。当使用分数模块中的分数函数时,我得到一个未减少的分数。

代码

from fractions import Fraction

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

返回3152519739159347/2251799813685248,缩小为7/5

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

2 个答案:

答案 0 :(得分:6)

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

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

>>> '{:030f}'.format(1.4)
1.39999999999999999999911182158029987

这种不准确导致它产生与7/5

不同的分数

如果你想要精确的分数数学,你需要使用分数来完成整个方程,而不是将它与浮点数混合。

答案 1 :(得分:5)

如果您想使用分数,则需要以精确数学运算执行所有操作,而不是仅在结尾处转换为Fraction。这意味着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))

否则,您将失去浮点舍入的精确度,并且您会遇到诸如使用limit_denominator来猜测未结果可能是什么的选项。