If语句不工作(Python)



这看起来很简单的代码,但由于某种原因,它就是不能工作。我需要在特定的时间输出一个值,但if语句似乎没有计算。以下是我要做的基本版本。

dt=.1
while t<=10:
     if t==5:
          print('yes')
     t+=.1

我确实在我的代码中尝试过这个,我甚至让它为每个时间步打印t,但它不会打印'yes '。我的代码中还有其他的if语句,比如

if 10<=t<60:
     do stuff

和这些if语句运行得很好。我试过t==5.0t==float(5),以防万一它需要,但它也不起作用。这快把我逼疯了,所以如果有人能帮帮我就太好了。我在Ubuntu 12.4的Spyder上运行这个,我一直收到一条消息说import sitecustomize失败了。这和这件事有关系吗?我已经用这个消息运行代码一段时间了,它以前没有引起任何问题。

编辑

让它工作,我使用

if int(t)==5 and t<5+dt:

Thanks for the help

1)浮点数不是无限精度的——它们占用一定数量的内存(通常是64位或32位)。

2)他们使用二进制内部表示尾数(基本上除了第一个有效数字之外的所有有效数字)。

3) .1不能精确地存储为二进制表示-只能作为二进制位的无限重复模式,并且由于尾数只有这么大,浮点数实际上是.1的近似值,而不是真正的。(然而,像0.5和0.25这样的东西可以)

4)因此,把0.1 s加起来并不能保证得到完美的结果——四舍五入会产生错误。例如,1加10次可能等于1 000……9.

参见http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html每个计算机科学家应该知道的浮点算术

有很多关于为什么浮点运算不准确的注释,但是没有回答如何修复代码。

长话短说,while t<10.0+dt/2if abs(t-5.0) <= dt/2

一个基于你写的代码写得很差的例子对我来说已经足够好了。
所以精确控制可能是你正在寻找的:
http://docs.python.org/3.3/library/decimal

    from decimal import *
    getcontext().prec = 3
    dt=.1
    t = 0
    while t <= 10:
        if Decimal(t) == 5:
            print('yes')
        t = Decimal(Decimal(t) + Decimal(dt))
        print(t)

这是因为您的t是浮点数,并且在机器代码中表示的准确性不是100%。您需要将其转换为整数,或者更改if条件以解决此问题(转换为整数或使用不等式)。

尝试将t(这是浮点数)转换为整数,然后比较…

if int(t) == 5:
   ...

import math
t_flr = math.floor(t)
if t_flr == 5:
   ...

相关内容

  • 没有找到相关文章

最新更新