Вы делаете это намного сложнее, чем нужно.Используйте атрибут denominator
экземпляра Fraction
:
frac = Fraction(z)
if frac.denominator > 2:
print(z)
else:
print(frac)
Возможно, вы захотите использовать метод Fraction.limit_denominator()
для учета неточного характераиз чисел с плавающей запятой:
frac = Fraction(z).limit_denominator()
if frac.denominator > 2:
print(z)
else:
print(frac)
Fraction.limit_denominator()
находит ближайшую дробь к оригиналу, где знаменатель ограничен, ниже 1 миллиона:
>>> from fractions import Fraction
>>> 2/3
0.6666666666666666
>>> Fraction(2/3)
Fraction(6004799503160661, 9007199254740992)
>>> Fraction(2/3).limit_denominator()
Fraction(2, 3)
Другая альтернатива - передать пользовательский ввод прямодо Fraction()
;конструктор принимает оба допустимых значения для строк float()
и в форме числитель / знаменатель (с необязательным знаком).Это позволит вашим пользователям вводить точные дроби, такие как '2/3' :
z = Fraction(input()).limit_denominator()
if frac.denominator > 2:
print(float(z))
else:
print(frac)