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 などの別の構文を選択することもできましたが、その場合の違いは何でしたか?

4

4 に答える 4

7

Math.Truncate() を使用します。

if (Math.Truncate(x) == Math.Truncate(y))

[編集] double の整数部分を比較している場合、int 値にキャストすると、最初に double が int として表現できる範囲外にある場合にオーバーフローのリスクが発生することに気付きました。

Truncate は Decimal または double を返し、この問題を回避します。

于 2008-10-25T12:42:14.650 に答える
4

はい、それが最善のアプローチです。

質問の文言から、丸めについて心配していないと仮定すると...整数部分だけです。

すなわち。(int)4.1 は (int)4.9 と同じ結果になります。

Ovid が述べたように、比較に変数のみが必要な場合は、比較ステートメントで double をキャストするだけで済みます。私は理論だけを見ていました。

于 2008-10-25T12:36:00.437 に答える
1

個人的には、必要でない限り、余分な変数を作成しないようにしています。

if ( (int)dA != (int)dB ) {
    ...
}

コードは時間の経過とともに進化するため、余分な変数が目的もなくぶらぶらしていると、混乱が生じます。もちろん、これらの変数が必要な場合、それは別の問題です:)

補足:単純なハンガリー語表記を使用してデータ型をほのめかそうとしているようです。そうしないことをお勧めしますか?変数の前に情報を付ける必要がある場合は、変数のタイプではなく、その変数の目的を前に付けるようにしてください。これを行うと、コードの間違いが見つけやすくなります。

if ( (int)ageA != (int)idB ) {
    ...
}

この場合、データが何であるかを知らなくても、'age' と 'id' を比較しようとしていることを確認することは、ここで何かが間違っていることを示す良い手がかりになります。

于 2008-10-25T12:36:30.217 に答える
1

切り捨てがあなたが望むものであることに同意します。

MSDNからの役立つ情報:

Truncate は、小数桁が破棄された後の残りの数値を返します。

ゼロに向かって最も近い整数に丸めます。

double floatNumber;

floatNumber = 32.7865;
// Displays 32      
Console.WriteLine(Math.Truncate(floatNumber));

floatNumber = -32.9012;
// Displays -32       
Console.WriteLine(Math.Truncate(floatNumber));
于 2008-10-25T13:34:37.847 に答える