除了as_integer_ratio()之外,还有替代方法可以获取“更干净的”分数吗?

时间:2019-05-14 09:44:59

标签: python

我知道我可以使用: -0.5.as_integer_ratio();并得到整数分数:1/2

但是,如果我有一个小数,例如: -8.333333333333334;等效于:25/3;我使用8.333333333333334.as_integer_ratio();我得到:(4691061961859793,562949953421312)

是否有一种功能/方式可以替代“干净”的25/3?

2 个答案:

答案 0 :(得分:5)

如果要精确表示25/3之类的分数,则首先不应该在浮点数中进行数学运算。您应该使用精确的有理类型,例如fractions.Fraction

from fractions import Fraction
x = Fraction(75)
y = x/9
print(y)

输出:

25/3

如果您使用浮点数或十进制字符串,可以将其转换为Fraction,然后使用limit_denominator查找附近带有小分母的分数。默认情况下,“小”被视为<= 1000000,但是您可以配置限制。

print(Fraction(8.333333333333334).limit_denominator())

输出:

25/3

从一开始就以有理算术处理所有事情几乎总是更好。

答案 1 :(得分:0)

您可以简单地通过导入python模块@Fraction和@Decimal来做到这一点,所以让我们看看它是如何工作的:

从十进制导入小数从十进制导入分数

Fraction(Decimal('8.33333333333334'))。limit_denominator()

注意:limit_denominator是将简化您的分数到尽可能最低的值。传递给小数的参数必须用引号引起来