> 백엔드 개발 > C++ > `x == 0.1`이 항상 C#의 `double` 데이터 유형과 작동하지 않는 이유는 무엇입니까?

`x == 0.1`이 항상 C#의 `double` 데이터 유형과 작동하지 않는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-22 20:46:11
원래의
657명이 탐색했습니다.

Why Doesn't `x == 0.1` Always Work with C#'s `double` Data Type?

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.1x일 때 double이 실패할 수 있는 이유입니다.

위 내용은 `x == 0.1`이 항상 C#의 `double` 데이터 유형과 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿