次の手順を検討してください:
このプログラムはfalseを出力します。これは、0.09
100が0.09class Program { static void Main(string[] args) { float f1 = 0.09f * 100f; float f2 = 0.09f * 99.999999f; Console.WriteLine(f1 > f2); } }
精度の問題を理解してください
この精度の理由は、フローティングポイント数がメモリで表現される方法です。これらのデジタルストレージは、テール番号(小数部)、インデックス(ベースのパワー)、およびシンボルの組み合わせです。ただし、テール番号の精度は限られています。 C#では、シングルプレシジョンフローティングポイント番号(FLOAT)の23桁、デュアル - 受典フローティングポイント数(double)には52ビットテール番号があります。エンディング番号を正確に表現できない場合、それは4つの家と5つの家に入り、数字を表すために最も近いものになります。 上記の例では、0.09
100の精度は9.000000190734863ですが、精度が制限されているため、32ビットフロートから9.0で表されます。同様に、0.09 99.999999 4軒の家、5つの5つは9.0です。その結果、これらの2つの値は比較的等しく、プログラムはFALSEを出力します。この精度を低下させるために、IEEE 754フローティングポイント操作標準では、「エプシロン」の概念を導入します。つまり、最小前方振動ポイントを変更せずに1.0に追加できます。 C#では、この値は約1.4013E-45です。
2つの浮遊点数値の差をエプシロンと比較することにより、浮動小数点の精度範囲内での有効性に対して有効であるかどうかを判断できます。以上がC#の浮動小数点比較が予期しない結果をもたらすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。