C#에서 이중 값을 비교하는 안정적인 방법
C#에서는 부동 소수점 연산의 본질적인 한계로 인해 배정밀도 값을 비교하면 예상치 못한 결과가 발생하는 경우가 많습니다. 왜 이런 일이 발생하는지 이해하기 위해 부동 소수점 정밀도가 부족한 이유를 살펴보겠습니다.
부동소수점 정밀도가 부족함
float 및 double 데이터 유형은 숫자 값을 이진 형식으로 저장합니다. 이 형식은 본질적으로 0.1과 같은 간단한 소수 값을 포함하여 특정 숫자를 정확하게 표현하는 정밀도가 부족합니다. double에 0.1 값이 할당되면 실제로는 실제 십진수 값의 근사치인 이진 표현이 저장됩니다. 이러한 정밀도 부족은 십진수를 이진 분수로 변환하는 특성에서 비롯됩니다.
가능한 해결 방법
이중 값 비교를 효율적으로 처리하려면 다음 해결 방법을 고려하세요.
double-to-double 값 비교: double 값을 비교할 때 일반적으로 항등 연산자(==)를 사용하지 않는 것이 좋습니다. 대신, 잠재적인 반올림 오류를 설명하기 위해 대략적인 비교 방법을 사용할 수 있습니다. 여기에는 일반적으로 공차 값을 정의하고 두 값 간의 차이가 해당 공차보다 작은지 비교하는 작업이 포함됩니다.
Decimal 데이터 유형: 정확한 숫자 연산 및 비교를 위해 10진수 표기법으로 값을 저장하는 10진수 데이터 유형을 사용하는 것이 좋습니다. 이 접근 방식은 0.1과 같은 소수 값의 정확한 표현을 보장합니다.
추가 지침
부동 소수점 및 이중 저장소의 정밀도가 부족한 이유는 이진 표현이 1/2, 1/4 등과 같이 2의 거듭제곱인 숫자 값에 자연스럽게 맞기 때문입니다. 그러나 0.1(1/10)과 같은 특정 분모를 갖는 소수는 반올림 오류 없이 정확하게 이진수로 표현할 수 없습니다.
예
<code class="language-csharp">double x = 0.1; double y = 0.1; double tolerance = 0.000001; // 定义容差 if (Math.Abs(x - y) < tolerance) // 使用容差进行近似比较 { // 代码块 }</code>
이 예에서는 Math.Abs()
을 사용하여 두 double 값 사이의 절대 차이를 계산하고 이를 사전 정의된 허용오차와 비교하여 double 값을 보다 안정적으로 비교할 수 있는 방법을 보여줍니다. 적절한 공차 값을 선택하는 것은 특정 응용 프로그램 시나리오와 정확도 요구 사항에 따라 달라집니다.
위 내용은 C#에서 Double 값을 어떻게 안전하게 비교할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!