Поскольку вы работаете в Python, каждое написанное вами выражение проходит через семантику Python. Таким образом, 1/5
становится 0.25
, прежде чем SymPy сможет что-либо с ним сделать. Это описано в файле gotchas.rst в документации.
Единственный раз, когда вы столкнетесь с этим, это когда у вас есть два ведущих числа в продукте, разделяющих друг друга, как в 1/5*x
, но не x*1/5
. В таких случаях вы можете предотвратить их превращение в число с плавающей точкой, заключив один из них в S()
, чтобы сделать его номером SymPy, а не числом Python, например S(1)/5*x
. Этот упреждающий шаг необходим во всех контекстах, где вы используете дробь чисел c отдельно или в качестве первого фактора в продукте
>>> x.subs(x, 1/5)
0.2
>>> x.subs(x, S(1)/5)
1/5
Если у вас есть выражение, в которое вы хотите преобразовать числа с плавающей точкой назад к Rationals вы можете использовать nsimplify(..., rational=True)
:
>>> nsimplify(0.25*x + 0.5*y, rational=True)
x/4 + y/2