私はいくつかの方法を考えることができます、例えば。
Convert.ToInt32(floatingPoint) - floatingPoint == 0;
Math.Truncate(floatingPoint) - floatingPoint == 0;
floatingPoint % 1 == 0;
Math.Floor(floatingPoint) == floatingPoint;
//etc...
しかし、どの方法が最も信頼できますか?
私はいくつかの方法を考えることができます、例えば。
Convert.ToInt32(floatingPoint) - floatingPoint == 0;
Math.Truncate(floatingPoint) - floatingPoint == 0;
floatingPoint % 1 == 0;
Math.Floor(floatingPoint) == floatingPoint;
//etc...
しかし、どの方法が最も信頼できますか?
浮動小数点数には通常、割り当てた数値に最も近い近似値しか含まれないため、ゼロと正確に等しいかどうかを確認しないでください。
たとえば、型が表すことができる 42 に最も近い値は、42.00000000000000662 のようなものである可能性がありますが、それでも整数値としてカウントする必要があります。
値と丸められた値の差を取り、その絶対値を (負にならないように) 取り、小さい値と比較します。
if (Math.Abs(Math.Round(floatingPoint) - floatingPoint) < 0.000001) ...
浮動小数点は一部の整数を正確に表すことができないため、真に信頼できる方法はありません。具体的にint
は、2^24 より大きい値は a で正確に表すことはできませんfloat
。残念ながら、それは浮動小数点表現を使用するために支払う代償の一部です!
知っておくべき浮動小数点に関するさまざまな問題の優れた要約については、「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」を確認することをお勧めします。
信頼性に関係なく、モジュロ法は理解しやすく(仕様を読み取る必要がない)、高速(関数呼び出しなし)に見えます。
一般的に信頼できる方法はありません。
浮動小数点数は、以前の計算の結果である場合、(ほとんど) 常に近似であるため、他の人が指摘したように、単純な整数の等価性はありません。
扱っている fp 値と int 値の両方の範囲と精度を考慮する必要があります。それはすべて、達成しようとしていることに依存します。
Guffa は、int 比較に許容範囲の精度を使用する優れたアプローチを採用しています。
浮動小数点数が近似値にすぎないという古典的な問題に遭遇します。これを行う場合:
floatingPoint = 1.0/3.0;
floatingPoint *= 3;
最終的には 1 に近いものになりますが、厳密には 1 ではありません。
整数は浮動小数点表現で正確に表現できるため、正確な整数をチェックしている場合は、それらのいずれかが機能するはずです(個人的には最初のものを使用します...)