0.1 + 0.2 == 0.3 ==> False
これを python、c#、c++、F#、Visual Basic.NET、ASP.NET で試しました。
0.1 + 0.2 == 0.30000000000000004 ==> True
これは、上で言及したすべての言語に当てはまります。この非論理的な不平等はなぜ起こるのでしょうか?
Python には、これを true に評価できるようにする 10 進ライブラリがあります (また、なぜそれが false なのかについても説明します)。実際、それらはほぼ同じ正確な例を使用しています: 2/library/decimal.html
正確さは算術に引き継がれます。10 進浮動小数点では、0.1 + 0.1 + 0.1 - 0.3 は正確にゼロに等しい
また、「すべてのコンピューター科学者が浮動小数点について知っておくべきこと」という、何年も前に書かれた影響力のある記事であり、今日でも有効です。
これを読んでみてください: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html (すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと)
短い答えは、バイナリでは 0.1 は繰り返し分数であり、1/8 と 1/16 の間の「どこか」にあるため、0.1 (または 0.2) の「正確なビット」表現はありません。浮動小数点値を比較するときは、そのような問題を防ぐために常にイプシロン値内で行う必要があります。
Python ドキュメントからこれを読んでください。それはすべての言語にほぼそのまま適用されます。
浮動小数点数を比較するには、次のパターンを使用します。
Math.Abs(NumberToCompare1 - NumberToCompare2) < 0.01
0.01 は演算の精度である Epsilon です。