2

我在 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)
4

3 回答 3

3

测试基数 10float的(不)相等性几乎总是错误的做法,因为它们几乎总是不能在二进制系统中精确表示。

从我看到的你的代码片段来看,你应该与字符串进行比较,如果它不是可怕的 -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)
于 2013-01-29T01:01:22.637 回答
0

不管我对 decimal 模块的评论如何,浮点 arithemitc 都有它的问题(在 python中也是如此)。其中最重要的是,由于表示错误,纸上相等的两个数字在程序比较时将不相等。

绕过它的方法是查看两个数字之间的相对误差,而不是简单地比较它们。

在伪:

if abs(num1 - num2)/ abs(num2) < epsilon:
    print "They are close enough"

在你的情况下:

if abs(temparture + 0.062)/0.062 < 10**-3:
    return("#error")

基本上,我们检查数字是否“足够接近”以被认为是相同的。

于 2013-01-29T00:57:13.453 回答
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
于 2013-01-29T01:08:15.440 回答