質問

不平等のために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));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top