得到最简化的分数

Get the most simplified fraction

我正在编写一个使用 Fractions 模块的程序。我想获得浮点数的最简化部分。当我用 0.5 这样的数字尝试时,它工作正常:

>>> import fractions
>>> str(fractions.Fraction(0.5))
'1/2'

但是当我尝试使用 0.550.1 时,它显示的分数具有非常高的分子和分母,而不是 11/201/10

>>> str(fractions.Fraction(0.1))
'3602879701896397/36028797018963968'
>>> str(fractions.Fraction(0.55))
'2476979795053773/4503599627370496'

我该怎么做才能确保脚本始终显示最简化的分数?有什么办法可以用 Fractions 模块或其他模块来完成,还是我必须自己编写函数?

试试这个:

fractions.Fraction(0.1).limit_denominator()

查看结果:

In [77]: str(fractions.Fraction(0.55).limit_denominator())
Out[77]: '11/20'

In [78]: str(fractions.Fraction(0.1).limit_denominator())
Out[78]: '1/10'

当您传递 0.55 时,您传递的是一个浮点数,因此在 Fraction 接收值之前它已经是一个不精确的表示。

或者,如果您改为传递字符串,则可以获得您想要的确切值:

>>> fractions.Fraction('0.55')
Fraction(11, 20)

尝试使用 docs 中的 decimal 模块示例:

>>> from fractions import Fraction
>>> from decimal import Decimal
>>> Fraction(Decimal('0.55'))
>>> Fraction(11, 20)
>>> str(Fraction(11, 20))
>>> '11/20'

将其作为字符串传递以获得简化分数:

>>> fractions.Fraction('0.1')
Fraction(1, 10)
>>> str(fractions.Fraction('0.1'))
'1/10'