创建一组涉及float的实例

时间:2018-06-18 08:39:12

标签: python floating-point set

我有一个类有浮点数x(和y,从x生成,所以如果x是等价的,y也是等价的)。初始化后,实例不会更改。我想创建一组实例(使用.add()),所以我试着让类可以使用:

class X:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def __hash__(self):
        return hash(tuple(self.x))
    def __eq__(self,other):
        return (
            self.__class__ == other.__class__ and
            self.x == other.x
            )

但是由于浮点不准确,该集合将识别两个非常接近的实例。我想将__eq__设置为

    def __eq__(self,other):
        diff = np.max(np.asarray(self.x)-np.asarray(other.x))
        if diff<1e-6:
            return True
        else:
            return False

但这并不能解决浮点问题。 我可以使用元组(x,y)来解决这个问题,但我不需要比较y,而我正在处理的真正的类有点复杂。

1 个答案:

答案 0 :(得分:1)

您可以使用标准库中math modulemath.isclose来比较浮点数,并且可能将用于生成哈希值的值舍入(或截断)为默认使用的小数位数按isclose。 (最后一个值可以参数化)

class X:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def __hash__(self):
        return hash(tuple(round(self.x, 9))  # round the value hashed to match the default of math.isclose

    def __eq__(self,other):
        return (
            self.__class__ == other.__class__ and
            math.isclose(self.x, other.x)
            )