分数函数返回未约简的分数

4
我正在尝试将一个数学表达式转换为最简分数。当使用fractions模块中的Fraction函数时,我得到了一个未化简的分数。

代码:

from fractions import Fraction

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

返回 3152519739159347/2251799813685248 ,它简化为 7/5
我希望我的代码返回简化后的分数。

8
3152519739159347/2251799813685248无法化简为7/5。 - user2357112
3
你正在使用一个不精确的浮点数来构建一个分数 - 不要这样做。 - jonrsharpe
6
如果你想进行分数数学运算,就需要从一开始使用Fraction,而不是在所有的数学运算已经使用浮点数完成后再使用。 - user2357112
2
3152519739159347 * 5 - 7 * 2251799813685248 -> -1 - DYZ
3
计算器的精度有限。同时,你真的需要学习算术原理,而不仅仅是学会如何使用计算器。2251799813685248并不以0或5结尾,因此它不是5的倍数,也没有任何分母为2251799813685248的分数可以简化为分母为5的分数。 - user2357112
显示剩余9条评论
2个回答

6
这是由于浮点数的不精确性所导致的。
虽然 1 + 1/(2 + 1/2) 应该化简为 7/5(或 1.4),但小数 1.4 无法被浮点数精确表示。
>>> '{:030f}'.format(1.4)
1.39999999999999999999911182158029987

那个不准确性导致它生成的分数与7/5不同。

如果您想要精确的分数计算,需要使用分数进行整个方程式的计算,而不是将其与浮点数混合使用。


5
如果你想使用分数进行计算,那么你需要在所有的操作中都使用精确的数学计算,而不仅仅是在最后将其转换为Fraction。这意味着不能用int除以int - 否则会得到一个浮点数。
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等选项来猜测未舍入结果的情况下。

1 + F(1, 2 + F(1, 2)) 已经是一个 Fraction,你不需要再次将其发送到 F - Patrick Haugh
2
你也可以使用F(1)/2F('1/2')来获取比F(1, 2)更可读的结果。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接