2012-05-07 76 views
-2

我目前正在用Python做一些事情,并且在分配变量时出现一些奇怪的行为。例如,我设置“A”到0.1的IPython的控制台:在Python中赋值变量 - 奇怪的行为

In [1]: a = 0.1 

然后我打印:

In [2]: a 
Out[2]: 0.10000000000000001 

In [3]: a == 0.1 
Out[3]: True 

In [4]: a == 0.10000000000000001 
Out[4]: True 

好吧,也许这是因为数字的有限表示(最后1在第16位)。但是:

In [17]: 1 == 0.10000000000000001 
Out[17]: False 

我必须被这个吓到吗?因为我是 ! ;-)

+7

*“也许是因为数字的有限表示的” *是的!哪个宇宙应该是'1 == 0.10000000000000001'(因此'1 == 0.1)是真的? –

+0

请参阅[this](http://stackoverflow.com/questions/10481156/double-or-float-datatype-doesnt-addup-properly-in-a-loop)问题。 –

+0

这里有什么问题? –

回答

4

了Python教程的Floating Point Arithmetic: Issues and Limitations一部分 - 你的描述与浮点数据类型(没有什么是Python特有)

此外,要知道固有的怪事是repr()(字符串表示)显示浮动漂亮的外观舍入 - 你的第一个a例如不完全0.1,可如果你更精确地打印可以看出:

>>> a 
0.1 
>>> print "%.50f" % a 
0.10000000000000000555111512312578270211815834045410 
+0

感谢您的解释。 :) – Bagheera

1

不,你不必害怕。这是严格的非强制性的,我认为这是浪费能源,真的。

只要理解这种现象(您已经认识到)并在必要时使用Decimal即可。

+1

Awww ...如果只有我是Jon Skeet,现在我已经达到了二十张选票。 –

+0

你必须回答C#的相同问题才能得到20票 –

+0

那么*那是人们仍然使用C#的原因吗?由于可能的投票,也许与Jon Skeet竞争的快感?啊哈! “Python世界统治计划”中的第一项:消除Jon Skeet! –