두 개의 비 integer 번호의 정수 부분을 비교하는 가장 좋은 방법은 무엇입니까?
문제
불평등을 위해 두 개의 복식의 정수 부분을 비교해야하며 현재 다음을 수행하고 있습니다.
int iA = (int)dA;
int iB = (int)dB;
if( iA != iB )
{
...
}
그러나 나는 이것보다 더 나은 접근법이 있는지 궁금합니다.
감사.
int에 대한 캐스트 대신 Math.truncate ()를 사용한 경우 평등에 대한 이중 값을 비교하는 것이 여전히 정확합니까?
헝가리 표기법에 대해 의견 :
나는 적어도 대부분의 사람들이하는 방식이 아니라 HN을 직접 사용하지 않습니다. 그러나 이것은 변수의 의미 론이 해당 유형과 직접 관련된 드문 경우 중 하나입니다. A_AS_INTEGER 및 B_AS_NONINTEGER와 같은 다른 구문을 선택할 수 있었지만 그 차이는 무엇입니까?
해결책
Math.Truncate () IE를 사용하십시오
if (Math.Truncate(x) == Math.Truncate(y))
편집] 더블의 정수 부분을 비교하는 경우 int 값으로 캐스팅하면 먼저 int로 표시 될 수있는 범위를 벗어나면 오버 플로우의 위험이 먼저 실행된다는 것을 깨달았습니다.
Truncate는이 문제를 피하면서 소수점 또는 두 배를 반환합니다.
다른 팁
예, 그것은 최선의 접근법입니다.
당신의 문구에서 당신의 질문에서 당신은 반올림에 대해 걱정하지 않습니다 ... 단지 정수 자체 만 있습니다.
즉. (int) 4.1은 (int) 4.9와 동일한 결과를 제공합니다.
OVID가 언급했듯이 비교를 위해 변수 만 필요하면 비교 문에서 더블을 시전하면됩니다. 나는 이론 만보고 있었다.
개인적으로, 나는 필요하지 않으면 추가 변수를 생성하지 않으려 고 노력합니다.
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));