2012-01-27 6 views
-2

Convert.ToDouble 추가하고 0과 1을주고있다 :이 사진에없는 정확한 숫자를 같은

enter image description here

을가 21.620000000000001에 21.62에서 돌고 이유는 무엇입니까? 부동 소수점 문제입니까?

+2

예, 부동 소수점 문제입니다. –

+0

@ uzay95이 문제가 부동 소수점 문제입니까? 예, 그렇습니다. –

+2

사진은 분명 도움이되지만 문제가되는 코드의 텍스트 표현을 첨부하면 좋을 것입니다. – JaredPar

답변

4

Double (및 Float)은 floating-point이고 이진 시스템에서는 부정확 할 수 있습니다.

보다 정확한 비교가 필요한 경우 decimal을 대신 사용하십시오. 만약 당신이 단지 계산을하고 있다면 double는 괜찮을 것입니다. 절대 equality에 대한 double을 비교해야하는 경우 차이의 절대 값을 작은 상수와 비교하십시오.

if (a == b) // not reliable for floating point 
{ 
    .... 
} 

double EPSILON = 0.0000001; 
if (Math.Abs(a-b) < EPSILON) 
{ 
    .... 
} 
+0

http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx –

+1

'System.Double.Epsilon'을 사용하고 싶다면 2 개의 double 값의 차이가 그 값보다 큰 : (MSDN에서) 두 부동 소수점 수를 같게 간주 할 수 있는지 여부를 결정하는 사용자 지정 알고리즘을 만드는 경우 Epsilon 상수보다 큰 값을 사용하여 두 개의 값이 동일하다고 간주됩니다. (전형적으로 차이의 차이는 엡실론보다 몇 배나 큽니다.) –

0

이와 같은 반올림 오류는 거의 모든 고급 프로그래밍 언어에서 공통적으로 발생합니다. Java에서이 문제를 해결하려면 정확성이 보장되어야하는 경우 BigDecimal이라는 클래스를 사용합니다. 그렇지 않으면 필요한 가장 가까운 위치로 소수점을 올림하는 메소드를 작성할 수 있습니다.

+0

Downvoters가 코멘트해야합니다. 이것은 나쁜 대답처럼 보이지 않습니다. – Yuck

+0

음, C#의 특정 답변을주지 않았고 "라이브러리 클래스 찾아보기"라고 말하면 가장 위대하지는 않습니다./ – thatidiotguy

+0

나는 downvote를하지 않았지만 동작이 아니라고 추가했습니다. 정말로 언어에 의해 결정된다. 언어는 단지 "IEEE double은 사용할 수있는 데이터 유형 중 하나입니다."라고 말합니다. 동작은 실제로 IEEE에 의해 지정됩니다. – phoog

2

간단히 말해서, 예; 어떤 두 개의베이스 (이 경우 2와 10) 사이에는 항상 소수점 이하 (십진수)로 표현할 수있는 값이 있습니다.

+0

사실, 그 사실을 알기 위해서는 기반이 공존해야합니다. 기수 2에 한정된 수의 장소가있는 분수는 기수 4, 8, 16 등의 한정된 수의 장소를 가지며 그 반대의 경우도 마찬가지입니다. – phoog

+0

좋은 전화; 그것이 내가 수학자 인 척하는 이유입니다! –

3

부동 소수점 숫자에는 근사값 문제가 있습니다. 0,00001과 같은 십진수는 이진 시스템에서 정확하게 표현할 수 없기 때문에 (분수는 q/p 모듈에 표시됩니다). 문제는 본질적입니다.