문제

C#의 다음 코드는 작동하지 않습니다.

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue.Equals(dValue);

그렇다면 질문 : Double과 INT를 비교하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

부동 소수점과 적분 값을 순진한 방식으로 비교할 수는 없습니다. 특히 고전이 있기 때문에 부동 소수점 표현 도전. 당신이 ~할 수 있다 Do는 하나를 다른 사람으로부터 빼고 그들 사이의 차이가 당신이 관심을 갖는 정밀도보다 적은지 확인합니다.

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.

다른 팁

모든 언어에서 평등에 대한 정수와 부동 소수점 숫자를 비교하는 것은 매우 나쁜 생각입니다. 그것은 매우 간단한 경우에 효과적이지만, 수학을 전혀 수행 한 후에는 프로그램의 유사성이 원하는 것을 극적으로 감소시킵니다.

부동 소수점 숫자가 이진 디지털 시스템에 저장되는 방식과 관련이 있습니다.

당신이 이것을 사용하고 싶다고 확신한다면, 수업을 만들어 분수로 숫자를 만들어보십시오. 하나의 int를 사용하여 정수를 유지하고 다른 int는 분수를 유지합니다.

이것은 실제로 당신이 "동등한"것으로 간주하는 것에 달려 있습니다. 이중이 정수 값과 정확히 일치하는 경우에만 비교를 반환하려면 (즉, 분수 구성 요소가 없음) 비교를 수행하기 위해 int를 두 배로 캐스트해야합니다.

bool isEqual = (double)iValue == dValue;

1.1과 같은 것이 1과 같은 것으로 간주되는 경우, 이중을 INT로 캐스트하거나 (분수 구성 요소를 완전히 무시하려는 경우) 1.9를 동일하게 말하려면 더블을 반올림 할 수 있습니다.

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 그리고 어느 쪽이든 integer 또는 long 엄격한 평등은 어떤 이유로 든 부유물 값으로 적분을 저장하거나 전달하고 나중에 다시 변환해야 할 때입니다. 이러한 전환은 대부분의 경우 적분 유형을 주조하여 가장 쉽게 달성 할 수 있습니다. double, 그런 다음 그 캐스트의 결과를 비교합니다. 전환에 유의하십시오 long 에게 double 숫자가 범위를 벗어난 경우 ± 2가 부정확 할 수 있습니다.52. 그럼에도 불구하고 64 비트 전날 long 사용 가능하게되었습니다. double 32 비트에 비해 너무 큰 정수 수량에 대한 편리한 저장 유형이었습니다. int 그러나 처리하기에 충분히 작습니다 double.

변환 a long 에게 double 그런 다음 비교를하면 "동일한"결과가 발생할 수 있습니다. double 정확하게 일치하지 않습니다 long 가치이지만 가장 가까운 것을 나타냅니다 double 그 가치에. 이 동작은 부동 소수점 유형이 실제로 단일 정확한 값이 아니라 오히려 다양한 값을 나타내는 것을 인식한다면 의미가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top