Как вернуть (не печатать) дробь в python, не упрощая ее?

#python

Вопрос:

Приведенный ниже код выводит упрощенную дробь. Но я хочу не упрощенный вариант. Пример: Если ответ 2/4, я хочу, чтобы код возвращал 2/4, а не 1/2.

 from fractions import Fraction
def frac(n,d):
    print(Fraction(n/d))
 

фракция(2,4) дает 1/2.

 from fractions import Fraction
def frac(n,d):
    return(Fraction(n/d))
 

frac(2/4) дает Fraction(1,2)

Чего я хочу, так это вернуть ( Fraction(n/d) ), чтобы отдать 2/4 .

Как мне добиться этого в python?

Комментарии:

1. Создайте свой собственный класс?

2. Почему это имеет для тебя значение? Объективно, 2/4 === 1/2 . Если вам нужны исходные значения, отслеживайте их в отдельной структуре данных или подклассе Fraction , чтобы сделать это за вас.

3. fractions.Fraction представляет собой рациональные числа, а не числитель и знаменатель. Это похоже на то, как int не представляет ведущие нули, потому что оно представляет целое число, а не последовательность цифр.

4. Также никогда не делайте Fraction(n/d) этого . Это делает плавающую арифметику. Воспользуйся Fraction(n, d) .

5. Несколько человек опубликовали ответы, используя параметр без документов _normalize . Не используй это. Он не предназначен для публичного использования, и если вы его попробуете, то все действительно сломается , начиная от неправильных математических результатов и заканчивая ложными ошибками обнуления. Вот пример неправильного математического результата , а вот пример ложного исключения .

Ответ №1:

Сначала давайте разберемся, что здесь происходит, а затем посмотрим, как это изменить.

У вас есть два разных вопроса/проблемы в этом одном вопросе.

Часть 1: Как получить «1/2» вместо «Дробь(1,2)»

Когда вы печатаете дробь, она сначала преобразуется в строку, и это возвращает нужный вам тип вывода. Если вы просто выводите дробь на консоль (что происходит при вызове функции из REPL), вместо этого она преобразуется в строку с помощью repr()

 str(Fraction(2/4)) --> "1/2"
repr(Fraction(2/4)) --> "Fraction(1, 2)"
 

Итак, во-первых, если вы хотите вернуть дробь в виде строки, перед return тем, как вам нужно будет привести ее к строке:

 def frac(n,d):
    return str(Fraction(n/d))
 

Часть 2: Не нормализуйте дробь

Ты сказал, что хочешь frac(2,4) вернуть "2/4" и не "1/2" хочешь . Давайте посмотрим, что происходит в вашем коде:

 Fraction(n/d)
 

Поскольку вы передаете n/d значение в качестве параметра Fraction() , деление будет выполнено первым, еще до того, как значение перейдет в Fraction() . Чтобы сделать этот момент более ясным, давайте выполним инструкцию кода за инструкцией:

 n=2
d=4
2/4 -> 0.5
Fraction(0.5)
 

Как вы видите, вы передаете разделенный результат Fraction() , поэтому Fraction() узнать делитель невозможно.

Но даже передача числителя и делителя в качестве отдельных параметров вам не поможет, поскольку дробь представляет собой нормализованную дробь.

Вот как работает этот класс.

Ответ №2:

Вы можете вернуть кортеж из числителя и знаменателя дроби, например (n, d), или в виде строки «1/2». Другого пути нет

Ответ №3:

Создание класса и подходящих функций может сработать.

 class frac():
    def __init__(self,num,den):
        self.num = num
        self.den = den
    def decimal(self):
        return self.num / self.den
 

Что — то в этом роде.