Python中的if语句和浮点数

2 投票
3 回答
20417 浏览
提问于 2025-04-17 14:00

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

撰写回答