代码之家  ›  专栏  ›  技术社区  ›  nickg

If语句不起作用(Python)

  •  1
  • nickg  · 技术社区  · 11 年前

    这似乎是非常简单的代码,但由于某些原因,它无法工作。我需要在某些时间输出一个值,但if语句似乎没有进行求值。以下是我尝试做的事情的基本版本。

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

    我确实在代码中尝试过,甚至让它在每个时间步都打印t,但它不会打印“是”我的代码中有其他if语句,间隔如下

    if 10<=t<60:
         do stuff
    

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

    编辑

    我用过了

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

    谢谢你的帮助

    5 回复  |  直到 11 年前
        1
  •  3
  •   Patashu    11 年前

    1) 浮点并没有无限的精度——它们在内存中占据一定数量的位(通常是64或32)。

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

    3) .1不能精确地存储为二进制表示,只能存储为二进制位的无限重复模式,而且由于尾数只有这么大,浮点数实际上是.1的近似值,而不是实际的.1。(不过,0.5和0.25之类的数值也可以)

    4) 因此,将.1s相加并不能保证得到完美的结果——四舍五入的方式会出错。例如,.1本身加十次可能会得到1.0000…1或0.99999…9。

    看见 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 每一位计算机科学家都应该知道浮点运算

        2
  •  2
  •   Maxim Razin    11 年前

    关于浮点算法不准确的原因,有很多评论,但没有回答如何修复代码。

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

        3
  •  1
  •   Ali    11 年前

    基于您编写的代码编写的一个非常糟糕的示例对我来说已经足够好了。
    因此,精确控制可能是您想要的:
    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)
    
        4
  •  0
  •   sashkello    11 年前

    这是因为你 t 是浮点,并且在机器代码中以不是100%的精度表示。您需要将其转换为整数,或者更改 if 条件,以便修复此问题(强制转换为整数或使用不等式)。

        5
  •  0
  •   Thunderboltz    11 年前

    尝试将t(浮点)转换为整数,然后进行比较。。

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

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