リスト内包表記を使用する場合:
[x * 0.1 for x in range(0, 5)]
私は次のようなリストを取得することを期待しています:
[0.0, 0.1, 0.2, 0.3, 0.4]
ただし、代わりにこれを取得します:
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4]
この背後にある理由は何ですか?
リスト内包表記を使用する場合:
[x * 0.1 for x in range(0, 5)]
私は次のようなリストを取得することを期待しています:
[0.0, 0.1, 0.2, 0.3, 0.4]
ただし、代わりにこれを取得します:
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4]
この背後にある理由は何ですか?
フロートは、ほとんどすべての言語で本質的に不正確です
正確な精度が必要な場合は、Decimalクラスを使用します
from decimal import Decimal
print Decimal("0.3")
見栄えを良くする必要がある場合は、表示するときにフォーマット文字列を使用するだけです。
"%0.2f"%2.030000000000034
それらを比較したい場合は、いくつかのしきい値を使用します
if num1 - num2 < 1e-3 : print "Equal Enough For Me!"
**しきい値処理に関する abarnert のコメントを参照してください ... これは、イプシロンしきい値処理のより詳細な説明の非常に単純化された例です。 20point%20numbers.htm
追加資料:
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html (詳細な説明)
http://floating-point-gui.de/basic/ (フロート全般を操作するための基本的なチュートリアル)
リストの理解は問題ではありません。
>>> 3 * 0.1
0.30000000000000004
>>> 2 * 0.1
0.2
>>> 0.1 + 0.2
0.30000000000000004
Python の浮動小数点演算と浮動小数点演算の詳細については、こちらを参照してください。
リスト内包表記は関係ありません。これは純粋に浮動小数点数の問題です。非常に詳細な回答については、この記事を読む必要があります: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html