문제에 두 번.분석에서 관리된 C++
-
11-09-2019 - |
문제
나는 점점 이상한 문제를 분석하는 동안 두 값에서 managed C++.그것이 될 수 있는 내가 뭔가 잘못입니다.마:
double value = 0.006;
result = Math::Parse( value)
출력의 결과이 0.006000000000001
.왜 그것은 추가 1?
도 갈 때는 라운드 가치를 5decimal places,그것은 실패합니다.나는 하:
result2 = Math::Round(result, 5)
지 result2
상 0.006000000000001
.무엇이 잘못된 것입니까?
해결책
보통이다. IEEE 형식의 이중 형식으로 인한이 문제 - 실제 0.006에서는 무한 이진 분획의 근사치로 표시됩니다. 그래서 당신은 3 가지 방법이 있습니다.
- 해당 문자열을 사용하여 출력을 사용하십시오
- 소수점 유형을 사용하십시오
- 숫자를 비교하려면 ==를 사용하지 말고, 대신 <또는>을 일정한 오류로 사용하십시오 : (x -0.06) <오류
다른 팁
이로 인해 정밀도입니다.이 대답 기:
수레와 숫자 복식 표현과 일정 정밀도입니다.모든 값을 수 있습니다 에 표시되는 이 형식입니다.보 기 뿐만 아니라.
당신은 쉽게 생각할 수 있는 이유이 경우:거기에 무제한 숫자의 번호에서 intervall (1..1)지만,float 단가 제한된 의 비트 수를 나타내 번호(-MAXFLOAT..MAXFLOAT).
더 적절하게 넣어:에서 32 비트의 정수 표현이 가산 숫자의 정수의 표현, 하지만 거기에 수많은 무한 숫자의 실제할 수 없는 값 완전에 표시되는 제한된 의 표현 32 또는 64 비트.따라서 뿐만 아니라는 한계 가장 높은 표현할 수 있는 가장 낮 실제 값이지만,또한 가능성을 제공합니다.
그래서 수 있는 작은 숫자 후 부동 소수점 영향을 받습니까?기 때문에 표현 에 기반하는 대신 바이너리 시스템 소수 만들기 쉽게 다른 번호 로 표현한 후 소수들.
이중 정밀 번호는 본질적으로 근사치이며 자주 꼬리가 있습니다. 제거 할 수 없습니다 - 즉, 숫자를 더 정확하게 표현할 방법은 없습니다.
사용하는 경우 기대하는 것처럼 더 많은 결과를 얻을 수 있습니다. decimal
- 여전히 근사치이지만 Base-10을 사용하므로 사람들이 기대하는 것처럼 더 많이 행동하는 경향이 있습니다. 그러나 CPU 유형에 매핑되지 않기 때문에 느리게됩니다.