문제

나는 점점 이상한 문제를 분석하는 동안 두 값에서 managed C++.그것이 될 수 있는 내가 뭔가 잘못입니다.마:

double value = 0.006;
result = Math::Parse( value)

출력의 결과이 0.006000000000001.왜 그것은 추가 1?

도 갈 때는 라운드 가치를 5decimal places,그것은 실패합니다.나는 하:

result2 = Math::Round(result, 5)

result20.006000000000001.무엇이 잘못된 것입니까?

도움이 되었습니까?

해결책

보통이다. IEEE 형식의 이중 형식으로 인한이 문제 - 실제 0.006에서는 무한 이진 분획의 근사치로 표시됩니다. 그래서 당신은 3 가지 방법이 있습니다.

  • 해당 문자열을 사용하여 출력을 사용하십시오
  • 소수점 유형을 사용하십시오
  • 숫자를 비교하려면 ==를 사용하지 말고, 대신 <또는>을 일정한 오류로 사용하십시오 : (x -0.06) <오류

다른 팁

이로 인해 정밀도입니다.이 대답 :

수레와 숫자 복식 표현과 일정 정밀도입니다.모든 값을 수 있습니다 에 표시되는 이 형식입니다.보 뿐만 아니라.

당신은 쉽게 생각할 수 있는 이유이 경우:거기에 무제한 숫자의 번호에서 intervall (1..1)지만,float 단가 제한된 의 비트 수를 나타내 번호(-MAXFLOAT..MAXFLOAT).

더 적절하게 넣어:에서 32 비트의 정수 표현이 가산 숫자의 정수의 표현, 하지만 거기에 수많은 무한 숫자의 실제할 수 없는 값 완전에 표시되는 제한된 의 표현 32 또는 64 비트.따라서 뿐만 아니라는 한계 가장 높은 표현할 수 있는 가장 낮 실제 값이지만,또한 가능성을 제공합니다.

그래서 수 있는 작은 숫자 후 부동 소수점 영향을 받습니까?기 때문에 표현 에 기반하는 대신 바이너리 시스템 소수 만들기 쉽게 다른 번호 로 표현한 후 소수들.

이중 정밀 번호는 본질적으로 근사치이며 자주 꼬리가 있습니다. 제거 할 수 없습니다 - 즉, 숫자를 더 정확하게 표현할 방법은 없습니다.

사용하는 경우 기대하는 것처럼 더 많은 결과를 얻을 수 있습니다. decimal - 여전히 근사치이지만 Base-10을 사용하므로 사람들이 기대하는 것처럼 더 많이 행동하는 경향이 있습니다. 그러나 CPU 유형에 매핑되지 않기 때문에 느리게됩니다.

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