float
Python で値を使用する場合、数値を完全に正確に比較することはできません。これは、浮動小数点値の精度が本質的に制限されているためです。
あなたの例では、数値は(コメントでnneonneoが述べたように)1.5999999999999999999999
と同じ浮動小数点表現になります。1.6
さらに驚くべきことは、浮動小数点表現がどちらのソース数値とも正確に等しくないことです (小数点以下 20 桁までは です1.60000000000000008882
)。1.6
Python はこれを少し隠します。数値を出力すると、数値が少し大きくなっても表示されるからです。
最後の余分なビットは丸め誤差です。これは、1.6 の反復しないバイナリ表現がないためです。3 分の 1 が無限に繰り返される 10 進数でしか正確に表現できないよう1.6
に、2 進数で正確に表現するには無限のビット数が必要です。エラーは、特定の桁数の後に表現を停止し、残りを丸めることから発生します ( として表現1/3
し0.333333
、繰り返される 3 の残りを切り捨てるなど)。
浮動小数点エラーの影響を軽減するコードを作成する方法はいくつかありますが、非常に高い精度が必要な状況で浮動小数点値を使用しないことを除いて、浮動小数点エラーを完全になくすことはできません。 . Python では、(ある程度のパフォーマンスを犠牲にして) 精度を上げたい場合は、代わりに標準ライブラリの Decimal クラスを使用できます。
from decimal import Decimal
d1 = Decimal("1.5999999999999999999999")
d2 = Decimal("1.6")
print(d1 >= d2) # prints: False