解決策
これは数値数学における既知の問題で、すべてのプログラミング言語で発生されます。ほとんどの浮動小数点数は 2 進数で正確に表現できないため、それらが等しいかどうかを比較すると予期しない結果が生じる可能性があります。
浮動小数点数は内部的に 2 進数の近似として表現されるため、値の外側の小数点以下の桁で小さな丸め誤差が発生します。このため、10 進数表記では正確である計算が 2 進数では正確ではないことがよくあります。たとえば、コンピュータは 0.1 + 0.2 = 0.3 を false として比較することがよくあります。これは、方程式の両辺のバイナリ表現が、たとえば 0.3000000000044 (またはマシンとコンパイル順序に応じて、同様の四捨五入の任意の数のバリアント) のような正確な値に近い値にしか実行できないため、等価性は false になります。

これを回避するには、浮動小数点値の比較ロジックを使用するときに、次のいずれかの方法を使用します。
- 「等しい」の代わりに「以上」または「以下」を比較します。
- 絶対差(絶対イプシロン)を許容して比較します。
- 相対イプシロン内で比較します。
- 数値を文字列に変換することで、指定された桁の精度内で比較します。
- 整数を使用して比較します。