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
自分にとって何equality
を意味するのかを本当に自分で定義する必要があります。たとえば、3.999999981 が 4 に「等しい」ように、浮動小数点値を最も近い整数に丸めることができます。または、値を切り捨てて、実質的に 3 になるようにすることもできます。達成しようとしています。
編集:しきい値の例として0.0000001を選択したことに注意してください...比較に十分な精度を自分で決定する必要があります。double
として定義されていると私が信じている通常の表現の範囲内にいる必要があることに注意してくださいDouble.Epsilon
。
どの言語でも、整数と浮動小数点数が等しいかどうかを比較することは、非常に悪い考えです。これは非常に単純なケースでは機能しますが、何らかの計算を行うと、プログラムが意図したとおりに動作する可能性が劇的に低下します。
これは、浮動小数点数が 2 進数のデジタル システムに格納される方法に関係しています。
これを使いたいと確信している場合は、クラスを作成して、分数を使用して自分の数を作成してください。1 つの int を使用して整数を維持し、別の int を使用して分数を維持します。
これは、何を「等しい」と考えるかに大きく依存します。double が整数値と正確に一致する (つまり、小数部分がない) 場合にのみ比較で true を返したい場合は、int を double にキャストして比較を行う必要があります。
bool isEqual = (double)iValue == dValue;
1.1 のようなものが 1 に等しいと見なされる場合は、double を int にキャストするか (小数部分を完全に無視する場合)、1.9 を 2 に等しくしたい場合は double を丸めます。
今日では、型の値を比較する必要があるのはほぼ唯一の場合でありdouble
、厳密に等しい場合は、何らかの理由で、整数値を浮動小数点値として格納または渡すことに行き詰まり、後でそれらを変換し直す必要がある場合ですinteger
。このような変換は、ほとんどの場合、積分型をにキャストし、そのキャストの結果を比較することlong
で最も簡単に実行できます。数値が± 252の範囲外の場合、からへのdouble
変換は不正確になる可能性があることに注意してください。それにもかかわらず、64ビットが利用可能になる前の数日間は、32ビットには大きすぎたが、で処理するには小さすぎる整数量の便利なストレージタイプでした。long
double
long
double
int
double
の公称値が値と正確に一致しないが、その値に可能な限り近い値を表す場合、をに変換してlong
からdouble
比較を行うと、「等しい」結果が得られることに注意してください。この動作は、浮動小数点型が実際には単一の正確な値ではなく、値の範囲を表すことを認識している場合に意味があります。double
long
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の可能な最小値です。