我试图将数学表达式转换为减少的分数。当使用分数模块中的分数函数时,我得到一个未减少的分数。
代码
from fractions import Fraction
print(Fraction(1 + 1/(2 + 1/2)))
返回3152519739159347/2251799813685248
,缩小为7/5
。
我希望我的代码返回减少的分数。
答案 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
来猜测未结果可能是什么的选项。