Python中的if语句和浮点数
我在Python里有一个函数,用来读取ds18b20温度传感器的数据。这个传感器大约有5%的时间会给我一个错误的值(-0.062)。虽然这不是个大问题,但我不想把这个值记录下来,因为在我的图表里看起来很难看。
我试着在一个if语句里“捕捉”这个值,把它替换成“#error”。下面的代码运行得很好,但似乎if语句有问题,总是执行else下面的内容。
我尝试了很多方法,甚至试着“捕捉”所有在1000到1500之间的值(这是在把温度读数除以1000之前的值),看看是否能对任何温度有效,但结果还是不行。
有没有人知道为什么我的if语句不工作呢?
def readtwo():
tfile = open("/sys/bus/w1/devices/28-0000040de8fc/w1_slave")
text = tfile.read()
tfile.close()
secondline = text.split("\n")[1]
temperaturedata = secondline.split(" ")[9]
temperature = float(temperaturedata[2:])
temperature = temperature / 1000
if temperature == -0.062:
return("#error")
else:
return(temperature)
3 个回答
-1
关于我提到的十进制模块,浮点数运算确实有一些问题(在Python中也有类似的情况)。最主要的问题是,由于表示上的误差,两个在纸上看起来相等的数字,在程序中比较时可能并不相等。
解决这个问题的方法是,比较两个数字之间的相对误差,而不是直接比较它们。
用伪代码表示:
if abs(num1 - num2)/ abs(num2) < epsilon:
print "They are close enough"
在你的情况下:
if abs(temparture + 0.062)/0.062 < 10**-3:
return("#error")
基本上,我们检查这两个数字是否“足够接近”,可以认为是相同的。
0
你也许可以把其余的代码稍微整理一下:
def readtwo():
with open("/sys/bus/w1/devices/28-0000040de8fc/w1_slave", 'r') as f:
secondline = f.readlines()[1]
temp = secondline.split(' ')[9][2:]
if '-62' in temp:
return '#error'
else:
return float(temp)/1000
3
在测试十进制的 float
数值是否相等时,几乎总是会出错,因为这些数值在计算机的二进制系统中几乎无法被精确表示。
根据我看到的你的代码片段,你应该先和字符串进行比较,如果不是那个让人头疼的 -0.062,再转换成浮点数。
def readtwo():
tfile = open("/sys/bus/w1/devices/28-0000040de8fc/w1_slave")
text = tfile.read()
tfile.close()
secondline = text.split("\n")[1]
temperaturedata = secondline.split(" ")[9]
temperature = temperaturedata[2:]
if temperature == '-0062':
return("#error")
else:
temperature = float(temperature) / 1000
return(temperature)