2つの非整数の整数部分を比較する最良の方法はどれですか?
質問
不平等のために2つのdoubleの整数部分を比較する必要があり、現在これを行っています:
int iA = (int)dA;
int iB = (int)dB;
if( iA != iB )
{
...
}
しかし、これよりも良いアプローチがあるのだろうか。
ありがとう。
intへのキャストの代わりにMath.Truncate()を使用した場合、結果として得られる2つのdouble値の同等性を比較することは正確ですか?
ハンガリー表記のコメントについて:
私は自分自身でHNを使用することはありません。少なくともほとんどの人がそうであるように。しかし、これは、変数のセマンティクスがその型に直接関係するこれらのまれなケースの1つです。 A_As_IntegerやB_As_NonIntegerのような別の構文を選択することもできましたが、その違いはどうでしたか?
解決
Math.Truncate()を使用、つまり
if (Math.Truncate(x) == Math.Truncate(y))
[編集] doubleの整数部分を比較している場合、intとして表現できる範囲外にdoubleがあると、int値にキャストすると最初にオーバーフローのリスクが発生することがわかりました。
TruncateはDecimalまたはdoubleのいずれかを返し、この問題を回避します。
他のヒント
はい、それが最善のアプローチです。
あなたの質問の文言から、丸めについて心配していないと仮定します...整数部分だけです。
ie。 (int)4.1は(int)4.9と同じ結果を返します
Ovidが述べたように、比較に変数のみが必要な場合、比較ステートメントでdoubleをキャストするだけです。私は理論だけを見ていました。
個人的に、必要でない限り、余分な変数を作成しないようにしています。
if ( (int)dA != (int)dB ) {
...
}
コードは時間の経過とともに進化するため、余分な変数が無意味にぶらぶらしていると混乱を招きます。もちろん、これらの変数が必要な場合は、別の問題です:)
補足:ハンガリー語の簡単な表記法でデータ型を暗示しようとしているようです。それをしないことをお勧めしますか?変数に情報のプレフィックスを付ける必要がある場合は、変数のタイプではなく、変数の目的にプレフィックスを付けてください。そうすることで、コードの間違いを見やすくすることができます:
if ( (int)ageA != (int)idB ) {
...
}
この場合、データが何であるかを知らなくても、「年齢」と「id」を比較しようとしていることがわかると、ここで何かが間違っていることがわかります。
Truncateがあなたの望むものであることに同意します。
MSDN からの役立つ情報:
Truncateは、小数桁が破棄された後に残る数値を返します。
最も近い整数にゼロに向かって丸めます。
double floatNumber;
floatNumber = 32.7865;
// Displays 32
Console.WriteLine(Math.Truncate(floatNumber));
floatNumber = -32.9012;
// Displays -32
Console.WriteLine(Math.Truncate(floatNumber));