문제

가능한 복제 :
C#가 부정확 한 부동 소수점 산술이있는 이유는 무엇입니까?

나는 일부 숫자와 c#을 다루고 있으며, 다음 코드 줄은 예상 한 것과 다른 숫자를 초래합니다.

double num = (3600.2 - 3600.0);

나는 NUM이 0.2 일 것으로 예상했지만 0.1999999999998181로 판명되었습니다. 그것이 가까이 있지만 여전히 다른 소수점을 생산하는 이유가 있습니까?

도움이 되었습니까?

해결책

이 때문입니다 double 플로팅 포인트 데이터 유형입니다.

더 큰 정확도를 원한다면 사용으로 전환 할 수 있습니다. decimal 대신에.

문자 접미사 decimal M이므로 사용합니다 decimal 산술 (및 생산 a decimal 결과) 코드를 다음과 같이 쓸 수 있습니다

var num = (3600.2m - 3600.0m);

사용에 대한 단점이 있습니다 decimal. 64 비트가 아닌 128 비트 데이터 유형입니다. double. 이것은 메모리와 처리 측면에서 더 비싸게 만듭니다. 또한 범위가 훨씬 작습니다 double.

다른 팁

이유가있다.

그 이유는 이중 데이터 유형의 경우 메모리에 저장되는 방식이 숫자 3600.2를 정확하게 표현할 수 없기 때문입니다. 또한 0.2의 정확한 표현을 허용하지 않습니다.

0.2는 이진에서 무한한 표현을 갖습니다. 메모리 또는 프로세서 레지스터에 저장하려면 일부 계산을 수행하려면 유한 표현이있는 0.2에 가까운 일부 숫자가 대신 저장됩니다. 이와 같은 코드를 실행하면 분명하지 않을 수 있습니다.

double num = (0.2 - 0.0);

이 경우 이중 데이터 유형에서 숫자를 나타내는 데 사용할 수있는 모든 이진 숫자는 숫자의 분수 부분 (분수 부분 만 있음)을 나타내는 데 사용되며 정밀도는 더 높기 때문입니다. 이중 유형의 객체에 숫자 3600.2를 저장하면 일부 숫자는 정수 부품 -3600을 나타내는 데 사용되며 분수 부품을 나타내는 숫자가 적습니다. 정밀도는 실제로 메모리에 저장된 부분이 낮고 분수 부분이면 0.2와 충분히 다르므로 이중에서 문자열로 변환 한 후에 분명해집니다.

유형을 변경하십시오 decimal:

decimal num = (3600.2m - 3600.0m);

당신은 또한 읽어야합니다 이것.

보다 위키 백과

더 잘 설명 할 수 없습니다. 나는 또한 독서를 제안 할 수 있습니다 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것. 또는 관련 질문을 참조하십시오 스택 오버플로.

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