Здесь (в python 3) 1/2 оценивается до 0,5, прежде чем даже будет передано в функцию. В этом конкретном примере c вы потеряли информацию из-за возможных ошибок точности с плавающей запятой до того, как функция была вызвана; Теоретически вы можете вернуться к 1/2 от 0,5, но вы не должны полагаться на эту манипуляцию с плавающей точкой. Чтобы не потерять эту точность, вам, вероятно, следует рассматривать дробь как две части целочисленной информации, как она есть на самом деле, вместо одного с плавающей точкой.
from fractions import gcd
def to_string(n, d):
g = gcd(n, d)
return str(n//g) + "/" + str(d//g)
Если то, что вы спрашиваете, относится именно к дробям, то класс, построенный вокруг этой идеи, вероятно, ваш лучший выбор. Если ваш пример не является пояснительным, то (как известно) python не имеет принудительного ввода типов. Однако вы можете прочитать здесь https://docs.python.org/3/library/typing.html о модернизации этой идеи и декораторов.