如果声明不起作用(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.0
和t==float(5)
,以防万一它需要但它也不起作用。这让我疯狂,所以如果有人能帮助我,那会很棒。我在Spyder上在Ubuntu 12.4上运行了这个功能,我收到一条消息,说import sitecustomize
失败。这与它有什么关系?我已经使用该消息运行了一段时间的代码,并且之前没有造成任何问题。
编辑
得到它的工作,我用
if int(t)==5 and t<5+dt:
感谢您的帮助
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
条件,以便修复此问题(转换为整数或使用不等式)。
有很多评论为什么浮点算术不准确,但没有答案如何修复代码。
长话短说,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)
[浮点不精确(http://docs.python.org/2/tutorial/floatingpoint.html) – jamylak 2013-04-11 05:16:29
HTTP:/ /docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html计算机科学家应该知道什么关于浮点运算 – Patashu 2013-04-11 05:17:37