如何在表达式中用理性替换浮点数?

aco*_*tis 5 python sympy

我有一个来自同情计算的表达式:

sqrt(pi)*(0.333333333333333*a + 0.333333333333333*b - 2.66666666666667*c**2)
Run Code Online (Sandbox Code Playgroud)

其中a,b,c是符号,并且想要解析它以便浮点数被替换为像in中的有理数

sqrt(pi)*(1/3*a + 1/3*b - 8/3*c**2)
Run Code Online (Sandbox Code Playgroud)

我知道如何手工完成,

In[24] Rational(str(0.333333333333333)).limit_denominator(1000)

Out[24]: 1/3
Run Code Online (Sandbox Code Playgroud)

但是我不太清楚如何解析原子并只挑选那些浮子,然后用有理数近似代替.

在表达式中进行这些替换的最明智的方法是什么?

asm*_*rer 7

用途nsimplify:

>>> print(nsimplify(sqrt(pi)*(0.333333333333333*a + 0.333333333333333*b - 2.66666666666667*c**2)))
sqrt(pi)*(a/3 + b/3 - 8*c**2/3)
Run Code Online (Sandbox Code Playgroud)