0

600 行の長いコードの中に、奇妙な計算をするコードの一部があります。

idl = 0
print type(dl), dl
idl = int(dl*10)+1
print idl

これは以下を返します:

<type 'float'> 0.1
1

この計算は、私のコードの定義で行われます。これは明らかに期待された結果ではありません。奇妙なことに、上記のコードを別の python ファイルにコピーすると、次のようになります。

idl = 0
dl = 0.1
print type(dl), dl
idl = int(dl*10)+1
print idl

私は得る:

<type 'float'> 0.1
2

この問題の原因は何ですか? 問題を簡単にするためにこれらの部分を抽出しましたが、必要に応じてより多くの情報を提供できます。

4

1 に答える 1

2

Eric Postpischil のコメントは的を射ています。

Python は、浮動小数点数の醜さの一部を一般ユーザーから隠そうとします。ほとんどの場合、問題ありません。時々、あなたは驚くでしょう。多くの 10 進数は、2 進数形式では正確に表現できません。繰り返しの分数や非常に長い分数になります。Python の表示コードは、2 進数の浮動小数点数を 10 進数に変換し、正しい位置に丸めることもあります。

このトピックに関する確かなリファレンスは次のとおりです。http://docs.python.org/2/tutorial/floatingpoint.html

提供されたコード スニペットは正しいものですが、int(round(dl*10)).

浮動小数点での 10 進数の不正確な表現に驚かされる場合 (たとえば、お金を扱っている場合のように)、decimal モジュールを確認してください: http://docs.python.org/2/library/decimal .html#module-10 進数

decimal モジュールは、10 進数の計算を行うための優れた機能を提供しますが、浮動小数点よりもやや扱いにくいものです。

なんといっても、この問題は Python に固有のものではありません。同様の問題は、ほとんどのプログラミング言語 (および問題を解決するための同様の 10 進数ライブラリ) で見つかります。

于 2013-05-16T04:01:21.903 に答える