Ответ 1
У вас есть два варианта:
-
Используйте
float.as_integer_ratio()
:>>> (0.25).as_integer_ratio() (1, 4)
(с Python 3.6 вы можете сделать то же самое с объектом
decimal.Decimal()
.) -
Используйте
fractions.Fraction()
type:>>> from fractions import Fraction >>> Fraction(0.25) Fraction(1, 4)
Последний имеет очень полезное преобразование str()
:
>>> str(Fraction(0.25))
'1/4'
>>> print Fraction(0.25)
1/4
Поскольку значения с плавающей запятой могут быть неточными, вы можете получить "странные" фракции; ограничьте знаменатель "немного упростить" фракцию, Fraction.limit_denominator()
:
>>> Fraction(0.185)
Fraction(3332663724254167, 18014398509481984)
>>> Fraction(0.185).limit_denominator()
Fraction(37, 200)
Если вы все еще используете Python 2.6, то Fraction()
пока не поддерживает передачу в float
напрямую, но вы можете объединить эти два метода выше:
Fraction(*0.25.as_integer_ratio())
Или вы можете просто использовать метод Fraction.from_float()
:
Fraction.from_float(0.25)
который по существу делает то же самое, например. возьмите целочисленный кортеж отношения и передайте это как два отдельных аргумента.
И небольшая демонстрация с вашими выборками:
>>> for f in (0.25, 0.5, 1.25, 3.0):
... print f.as_integer_ratio()
... print repr(Fraction(f)), Fraction(f)
...
(1, 4)
Fraction(1, 4) 1/4
(1, 2)
Fraction(1, 2) 1/2
(5, 4)
Fraction(5, 4) 5/4
(3, 1)
Fraction(3, 1) 3
Оба модуля fractions
и float.as_integer_ratio()
являются новыми в Python 2.6.