DoubleとIntを比較する最良の方法は何ですか?
質問
C#の次のコードは機能しません:
int iValue = 0;
double dValue = 0.0;
bool isEqual = iValue.Equals(dValue);
では、質問:DoubleとIntを比較する最良の方法は何ですか?
解決
浮動小数点値と積分値を単純に比較することはできません。特に、古典的な浮動小数点があるため 表現の課題。 できるできることは、一方から他方を引き、それらの差が、あなたが気にしている精度よりも小さいかどうかを確認することです:
int iValue = 0;
double dValue = 0.0;
var diff = Math.Abs(dvalue - iValue);
if( diff < 0.0000001 ) // need some min threshold to compare floating points
return true; // items equal
本当に、平等
の意味を自分で定義する必要があります。たとえば、浮動小数点値を最も近い整数に丸めて、3.999999981が「等しい」ようにすることができます。または、値を切り捨てて、実質的に3にすることもできます。これはすべて、達成しようとしているものによって異なります。
編集:しきい値の例として0.0000001を選択したことに注意してください...比較するのに十分な精度を自分で決める必要があります。 Double.Epsilon
として定義されていると思われる double
の通常の表現境界内にいる必要があることを理解してください。
他のヒント
どの言語でも整数と浮動小数点数が等しいかどうかを比較するのは非常に悪い考えです。非常に単純なケースで機能しますが、数学をまったく実行した後、プログラムが望んでいることを行う可能性は劇的に低下します。
浮動小数点数がバイナリのデジタルシステムに格納される方法に関係しています。
これを使用することを確信している場合は、クラスを作成して、小数部を持つ独自の数値を作成します。 1つの整数を使用して整数を維持し、別の整数を使用して小数を維持します。
これは、本当に「等しい」と考えるものに依存します。 doubleが整数値に正確に一致する場合(つまり、小数部がない場合)にのみ比較をtrueに戻したい場合は、intをdoubleにキャストして比較を行う必要があります:
bool isEqual = (double)iValue == dValue;
1.1のようなものが1と等しいと見なされる場合、doubleをintにキャストするか(小数部分を完全に無視する場合)、1.9を2にしたい場合はdoubleを丸めることができます。
double val1 = 0;
double val2 = 0.0;
if((val1 - Double.Epsilon) < 0)
{
// Put your code here
}
OR
if((val2 - Double.Epsilon) < 0)
{
// Put your code here
}
Double.Epsilonは、Doubleの可能な最小値です。
最近では、型 double
の値と、厳密な等価性のための integer
または long
の値を比較するのは、ほとんどの場合です。何らかの理由で、整数値を浮動小数点値として保存または渡すことができず、後で元に戻す必要があります。ほとんどの場合、このような変換は、整数型を double
にキャストし、そのキャストの結果を比較することで最も簡単に実現できます。数値が&#177; 2 52 の範囲外の場合、 long
から double
への変換が不正確になる可能性があることに注意してください。それにもかかわらず、64ビットの long
が利用可能になる前の数日間、 double
は32ビットの int <には大きすぎる整数量の便利なストレージタイプでした/ code>が、
double
で処理できるほど小さい。
long
を double
に変換してから比較すると、「等しい」が得られることに注意してください。 double
の公称値が long
の値と正確に一致しないが、その値に最も近い double
を表す場合の結果。この動作は、浮動小数点型が実際には単一の正確な値ではなく、値の範囲を表すことを認識している場合に意味があります。