【问题标题】:'if' condition doesn't work after second cycle'if' 条件在第二个周期后不起作用
【发布时间】:2018-01-29 22:31:02
【问题描述】:

if 循环有问题。在脚本中,我需要检查ii+1 行之间的差异是否等于0.6,如果是,那么程序应该计算grad[i] 值。问题是在第三个循环中,即使满足条件,grad[i] 的计算也不会执行。

这是我的代码的一部分:

data = np.loadtxt(files[p])
N=len(data)
print "N: ", N, "\n"
for i in range(0,N-1):
    print "i: ", i
    j=i+1
    Fi[i]=data[i,1]
    errFi[i]=data[i,2]
    Fj[j]=data[j,1]
    errFj[j]=data[j,2]
    t1=data[i,0]
    t2=data[j,0]
    dt=(t2-t1)
    print "dt:", dt
    print Fj[j]-Fi[i]
    if dt == 0.6:
        print " dt =", dt
        if Fi[i] < Fj[j]:
            r[i]=1
            grad[i]=(Fj[j]-Fi[i]) / dt
        else:
            r[i]=-1
            grad[i]=(Fi[i]-Fj[j]) / dt

        print " grad[",i,"]=",grad[i] 

控制台中的结果是:

i:  0
dt: 0.6
0.148645
dt = 0.6
grad[ 0 ]= 0.247741666667

i:  1
dt: 0.6
0.061069
dt = 0.6
grad[ 1 ]= 0.101781666667

i:  2
dt: 0.6
-0.009578

i:  3
dt: 0.6
0.078995

i:  4
dt: 0.6
0.069982

【问题讨论】:

  • 浮点数是近似值。仅仅因为它打印为0.6 并不意味着它完全等于0.6
  • 尝试改用round(dt, 1) == 0.6。就像@Barmar 所说,你的dt 可能不会是0.6 锐度。另外,请阅读浮动,包括发布的链接。
  • 非常感谢@Barmar 和@atru! round() 一切正常!

标签: python loops if-statement


【解决方案1】:

正如 cmets 中所述,您正在处理不精确的浮点数。尝试使用

data = 100 * np.loadtxt(files[p])

然后将dt60 进行比较。 grad 的值(在这个线性计算中)应该会自动结束。

如果这对您不起作用,您可以在乘以 100 后在 dt 上使用 round()

【讨论】:

  • Round 允许您四舍五入到任何您想要的小数。不需要输入乘法或任何其他类似的技巧,20 年前很有用。
  • @atru 你不需要为回合导入数学吗?
  • OP 已经在使用 numpy。这一轮是numpy的一部分。另外,导入数学有什么问题吗?我想如果你想要尽可能少的模块就可以了。
  • round 在 python 中已经内置了一段时间了——至少从 2.4 开始。
  • @NathanVērzemnieks 嗯...很高兴知道。我将把答案留在这里以便投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
相关资源
最近更新 更多