这看起来很简单的代码,但由于某种原因,它就是不能工作。我需要在特定的时间输出一个值,但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.0
和t==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/2
和if 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:
...