我想为练习创建一个类似概率的类,所以我构建了一个P类,并希望能够与它有一个相关的值。我还希望能够添加像P(“a”)+ P(“b”)这样的概率并让它们添加它们的值。编码很好,但我在测试时遇到了一些奇怪的行为。我只粘贴了下面代码的相关部分[这就是为什么它看起来有点冗长]:
class P:
def __init__(self, event):
self.event = event
self.v = 0
def value(self, val):
"""Sets the probability to the value 'val'."""
self.v = val
def add_stuff(x,y):
return lambda x,y: x+y
def __add__(self, other):
if isinstance(other, P): # if we are adding two P's together.
return add_stuff(self.v, other.v)
else: # if we are adding a number to our P.
try: return add_stuff(self.v, other)
except: raise TypeError(self.type_error_string)
a = P("a") # Creates the instances.
b = P("b") #
c = P("c") #
a.value(0.5) # Sets the value of a.v to 0.5,
b.value(0.1) # and so on for b and c.
c.value(0.2) #
print a.v + b.v == 0.7. # prints True.
print b.v == 0.1 # prints True.
print c.v == 0.2 # prints True.
print b.v + c.v # prints 0.3.
print type(b.v + c.v) # prints <float>
print b.v + c.v == 0.3 # prints False (!!).
这里的相关部分是底部。请注意,a.v + b.v [以及其他一些值]在测试时很好,但出于某种原因不是b.v + c.v。我不确定这里发生了什么。
答案 0 :(得分:0)
除了代码的其他一些问题之外,这个特殊问题在于浮点运算的工作方式:
>>> 0.1 + 0.2
0.30000000000000004
>>>
请阅读这篇精彩的文章:What Every Computer Scientist Should Know About Floating-Point Arithmetic。
简而言之:比较浮点数的方法是引入一些容差:abs(b.v - c.v) < Epsilon
(您应该适当地定义Epsilon
,例如1e-8
)。您也可以使用decimal
模块。
答案 1 :(得分:0)
根据您对add_stuff
和__add__
的定义,看起来您需要这样:
def __add__(self,other):
...
return add_stuff(self.v, other.v)(self.v,other.v) # add_stuff() returns a function which gets used in the second set of brackets
...