2012-05-07 9 views
-2

私は現在Pythonでいくつかのことをやっていますが、変数を割り当てるときに奇妙な振る舞いをします。その後、私は印刷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ですよ例えば、私は「」ipythonコンソールで0.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一部をチェック - 何を説明することもfloatデータ型(特定の何もパイソン)

に固有のすごみで、repr()(文字列表現が)きれいに見えるとのフロートを示していることに注意してください丸め - あなたの最初のaの例では、正確に0.1ではありません、あなたがより高い精度でそれを印刷する場合は見ることができる。

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

ありがとうございます。 :) – Bagheera

1

いいえ、あなたは怖い必要はありません。それは厳密に必須ではなく、私はそれをエネルギーの無駄だと考えています。

現象はすでに理解していますが、必要に応じてDecimalを使用してください。

+1

A ...もし私がJon Skeetだけだったら、今までに最大20の投票権を得ていただろう。 –

+0

あなたは20票を得るためにC#のために同じ質問に答えなければなりません –

+0

だから人々がまだC#を使用している理由は?投票が可能で、おそらくJon Skeetとの競争のスリル?ああ! Python World Dominationのための計画の項目番号1:Jon Skeetを削除! –