C#의 부동 소수점 수 비교: 소수 딜레마
C#에서는 double
유형의 값을 비교할 때 몇 가지 문제가 발생할 수 있습니다. 다음 코드를 고려해보세요:
<code class="language-csharp">double x = 0.1; if (x == 0.1) { // ... }</code>
놀랍게도 이 코드에는 if
문이 들어가지 않습니다. 왜 이런가요?
부동소수점 수 문제
문제의 근본 원인은 컴퓨터가 부동 소수점 숫자(구체적으로 double
)를 표현하는 방식에 있습니다. 정수와 달리 double
는 소수 대신 이진 분수를 사용합니다. 이는 0.1과 같은 일부 소수 값을 정확하게 저장할 수 없음을 의미합니다.
예를 들어, 이진 표기법에서 0.1은 0.000110011001100110011001로 표시됩니다.... 컴퓨터는 이 무한 루프의 소수점을 유한 표현으로 자르는데, 이는 예상 값과 정확히 일치하지 않을 수 있습니다.
솔루션
이 문제를 해결하려면 다음과 같은 방법을 고려해 볼 수 있습니다.
decimal
유형 사용: decimal
유형은 소수 표기법을 사용하여 숫자를 저장하므로 정확한 표현이 가능합니다. Math.Abs(x - 0.1)
)를 사용하세요. 이유 설명
2진 분수는 특정 숫자를 표현하는 능력이 소수 분수와 다릅니다. 예를 들어, 숫자 1/10은 이진수로 정확하게 표시할 수 없으므로 이진수 확장은 약 0.0001100이 됩니다. 컴퓨터의 반올림 프로세스로 인해 부동 소수점 숫자를 저장할 때 부정확성이 발생합니다.
위 내용은 C#에서 `x == 0.1`이 `double x = 0.1`과 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!