我发现了python模运算的一些奇怪行为。命令

a = 1.0 % 0.1


产量

a == 0.09999999999999995


在计算两个浮点数的最大公约数时,这是一个很大的错误,导致我遇到问题。我认为该错误与二进制(http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)中的0.1和1.0的非代表性有关。是否存在解决此问题的解决方法,或者有人可以将我指向一个可靠的函数来计算两个数字的gcd?到目前为止,我一直用于计算gcd的代码是

def 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


使用分数模块时,我遇到同样的问题。

最佳答案

您可以使用decimal模块。

from fractions import gcd
from decimal import Decimal
a,b  = 1.0,0.1
print(gcd(Decimal(str(a)),Decimal(str(b))))
0.1
a,b  = 22.8,9.3
print(gcd(Decimal(str(a)),Decimal(str(b))))
0.3

10-06 10:31
查看更多