Python有减少分数的功能吗?

LWZ*_*LWZ 22 python numerical numpy fractions python-2.7

例如,当我计算98/42我想得到的时候7/3,不是2.3333333,有没有使用Python的函数Numpy?

Joh*_*ooy 28

该fractions模块可以做到这一点

>>> from fractions import Fraction
>>> Fraction(98, 42)
Fraction(7, 3)
Run Code Online (Sandbox Code Playgroud)

有一个食谱在这里为numpy的最大公约数.然后您可以使用它来划分您的分数

>>> def numpy_gcd(a, b):
...     a, b = np.broadcast_arrays(a, b)
...     a = a.copy()
...     b = b.copy()
...     pos = np.nonzero(b)[0]
...     while len(pos) > 0:
...         b2 = b[pos]
...         a[pos], b[pos] = b2, a[pos] % b2
...         pos = pos[b[pos]!=0]
...     return a
... 
>>> numpy_gcd(np.array([98]), np.array([42]))
array([14])
>>> 98/14, 42/14
(7, 3)
Run Code Online (Sandbox Code Playgroud)


rah*_*uja 8

对约翰的回答的补充:

从小数中获取简化分数(例如 2.0372856077554062)

使用 Fraction 给出以下输出:

Fraction(2.0372856077554062)
#> Fraction(4587559351967261, 2251799813685248)
Run Code Online (Sandbox Code Playgroud)

要获得简化的答案:

Fraction(2.0372856077554062).limit_denominator()
#> Fraction(2732, 1341)
Run Code Online (Sandbox Code Playgroud)

  • @AnthonyLabarre 这可能看起来像一个“简单的情况”,但 1.8 不能精确地表示为二进制数;即,一个整数除以 2 的幂。因此它不能精确地表示为浮点数。解决方法是使用字符串而不是浮点数:将 `Fraction(1.8) --> Fraction(8106479329266893, 4503599627370496)` 与 `Fraction("1.8") --> Fraction(9, 5)` 进行比较。请注意,分母 4503599627370496 是 2**52。 (3认同)