C# double
비교: 정밀도 문제
부동 소수점 숫자(예: C#의 double
유형)를 사용하면 값을 비교할 때 예상치 못한 문제가 발생하는 경우가 많습니다. 일반적인 예는 double
변수를 0.1:
<code class="language-csharp">double x = 0.1; if (x == 0.1) { /* Code */ }</code>
이 단순해 보이는 비교는 의외로 실패할 수도 있습니다.
문제 이해: 이진수와 십진수 표현
근본 원인은 부동 소수점 숫자가 저장되는 방식에 있습니다. double
값은 소수가 아닌 이진 분수로 저장됩니다. 이는 0.1을 포함한 많은 소수 값이 이진 분수로 정확하게 표시될 수 없음을 의미합니다. 대신 컴퓨터는 근사치를 저장하므로 비교에 영향을 미치는 미묘한 차이가 발생합니다.
해결책: decimal
데이터 유형 사용
이러한 정밀도 문제를 방지하려면 decimal
데이터 유형을 사용하세요. decimal
값은 10진수 표기법을 사용하여 저장되므로 0.1과 같은 숫자를 정확하게 표현할 수 있습니다.
<code class="language-csharp">decimal x = 0.1m; if (x == 0.1m) { /* Code */ }</code>
decimal
을 사용하면 0.1의 정확한 저장 및 비교가 보장됩니다.
부동 소수점 표현: 심층 분석
문제를 설명하기 위해 십진수 표현을 고려해보세요. 12.34는:
<code>1 * 10^1 + 2 * 10^0 + 3 * 10^-1 + 4 * 10^-2</code>
마찬가지로 0.1은 다음과 같습니다.
<code>1 * 10^-1</code>
그러나 이진수에서 일부 숫자(예: 1/10 또는 0.1 소수)는 정확한 표현이 부족합니다. 근사치이므로 비교 시 예상치 못한 결과를 초래하는 불일치가 발생합니다. 이 근사치는 x == 0.1
가 x
일 때 double
이 실패할 수 있는 이유입니다.
위 내용은 `x == 0.1`이 항상 C#의 `double` 데이터 유형과 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!