分数函数返回未减少的分数
Fraction function returning unreduced fraction
我正在尝试将数学表达式转换为约化分数。当使用分数模块中的分数函数时,我得到一个未减少的分数。
代码
from fractions import Fraction
print(Fraction(1 + 1/(2 + 1/2)))
returns 3152519739159347/2251799813685248
减少到 7/5
.
我希望我的代码能够 return 减少的分数。
如果您想使用分数,您需要以精确的数学方式执行所有运算,而不仅仅是最后转换为 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
等选项来猜测未舍入的结果可能是什么。
这是由于浮点运算不精确造成的。
虽然1 + 1/(2 + 1/2)
确实应该减少到7/5
(或1.4
),但是小数1.4
不能用浮点数[=16]精确表示=]
>>> '{:030f}'.format(1.4)
1.39999999999999999999911182158029987
这种不准确导致它产生与 7/5
不同的分数
如果你想要精确的分数数学,你需要使用分数来计算整个方程,而不是将它与浮点数混合。
我正在尝试将数学表达式转换为约化分数。当使用分数模块中的分数函数时,我得到一个未减少的分数。
代码
from fractions import Fraction
print(Fraction(1 + 1/(2 + 1/2)))
returns 3152519739159347/2251799813685248
减少到 7/5
.
我希望我的代码能够 return 减少的分数。
如果您想使用分数,您需要以精确的数学方式执行所有运算,而不仅仅是最后转换为 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
等选项来猜测未舍入的结果可能是什么。
这是由于浮点运算不精确造成的。
虽然1 + 1/(2 + 1/2)
确实应该减少到7/5
(或1.4
),但是小数1.4
不能用浮点数[=16]精确表示=]
>>> '{:030f}'.format(1.4)
1.39999999999999999999911182158029987
这种不准确导致它产生与 7/5
如果你想要精确的分数数学,你需要使用分数来计算整个方程,而不是将它与浮点数混合。