如果声明不起作用(Python)

问题描述:

这看起来很简单,但由于某些原因,它不起作用。我需要在某些时候输出一个值,但if语句似乎没有评估。以下是我想要做的基本版本。如果声明不起作用(Python)

dt=.1 

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

我已经在我的代码字面上尝试这样做,我甚至已经受够了印花T为每一次的一步,但它不会打印“是”。我有我的代码中的其他if语句,如

if 10<=t<60: 
    do stuff 

以及这些if语句完美运行。我已经尝试过t==5.0t==float(5),以防万一它需要但它也不起作用。这让我疯狂,所以如果有人能帮助我,那会很棒。我在Spyder上在Ubuntu 12.4上运行了这个功能,我收到一条消息,说import sitecustomize失败。这与它有什么关系?我已经使用该消息运行了一段时间的代码,并且之前没有造成任何问题。

编辑

得到它的工作,我用

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

感谢您的帮助

+9

[浮点不精确(http://docs.python.org/2/tutorial/floatingpoint.html) – jamylak 2013-04-11 05:16:29

+2

HTTP:/ /docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html计算机科学家应该知道什么关于浮点运算 – Patashu 2013-04-11 05:17:37

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

2)他们使用尾数的二进制内部表示(所有的有效数字,但第一个,基本上)。 3).1不能作为二进制表示精确地存储 - 只能作为二进制位的无限重复模式,并且由于尾数仅如此之大,浮点数实际上是近似值.1,而不是真正的0.1。 (但是0.5和0.25这样的东西可以)但是)

4)因此,加起来的.1s并不能保证有完美的结果 - 会出现错误的方法。例如,.1添加到自己十次可能会使1.0000 ... 1或0.999999 ... 9。

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html什么每台计算机科学家应该知道关于浮点运算

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

试试这个转换吨(这就是浮存)为整数,然后比较..

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

OR

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

我宁愿使用'round'而不是'floor',因为您不知道在哪个方向错误将是。 – Patashu 2013-04-11 05:22:41

+0

谢谢,一旦我做了一个小小的调整,这个效果很好。 – nickg 2013-04-11 05:51:41

有很多评论为什么浮点算术不准确,但没有答案如何修复代码。

长话短说,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)