2012-05-07 45 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! –