Я хотел бы сделать арифметику для дробей и получить результаты как уменьшенные дроби.Например, я хочу, чтобы 1/4 + 1/16 вышло как 5/16.И затем я хотел бы использовать этот результат для дальнейших вычислений.Например, я хотел бы иметь возможность добавить 1 к 5/16 и получить 21 / 16.
Я попробовал 2 подхода, и ни один не был удовлетворительным.
Первый подход состоял в использованииfraction.Fraction.Здесь я получил следующее
In [12]: from fractions import Fraction
In [13]: Fraction(1/4+1/16)
Out[13]: Fraction(5, 16)
Очевидно, что Fractions знает, что делает, но не будет отображать результат как 5 / 16.
Тогда, как предложено в
добавление двух дробей в python
Я мог бы получить 5/16, напечатав Fraction (1/4 + 1/16), как в
In [187]: print(Fraction(1/4+1/16))
5/16
Однако это 5/16 предназначено только для отображения, поскольку оно не имеет типа
In [188]: type(print(Fraction(1/4+1/16)))
5/16
Out[188]: NoneType
и не может использоваться в дальнейших вычислениях
In [190]: print(Fraction(1/4+1/16)) + 1
5/16
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-190-87b52dc30510> in <module>()
----> 1 print(Fraction(1/4+1/16)) + 1
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
Таким образом, этот подход представляется тупиком.
Мой второй подход состоял в том, чтобы использовать sympy.simplify
На странице документации для упрощения,
http://docs.sympy.org/latest/tutorial/simplification.html#simplify
есть SymPy Live Shellэто можно использовать для экспериментов с упрощением.
Когда я ввожу упрощение (1/4 + 1/16) в Live Shell, я получаю
5
-
16
, что именно то, что я хочу.
Более того, когда я запускаю упростить (1/4 + 1/16) + 1 в Live Shell, я получаю
21
--
16
Так что упрощение, кажется, делает то, что я хочу.
Однако, когда я запускаю упростить (1/4 + 1/16) в ipython с python 3.6, я получаю
In [139]: simplify(1/4+1/16)
Out[139]: 0.312500000000000
Так что я получаю правильный ответ, но я не получаю дробный вывод, которыйLive Shell дал мне.
Почему поведение ipython отличается от поведения SymPy Live Shell?И есть ли другой способ получить то, что я хочу?