프로그램 에서 두 개의 Double 유형 에 오차 가 발생 하 는 해결 방법

오늘 자신 이 만 든 시스템 에서 이상 한 현상 을 발견 했다.몇 개의 Double 유형의 데 이 터 를 더 하면 마지막 에 얻 은 금액 은 정확 한 수치 보다 항상 몇 마 오 가 적다.프로그램의 계산 방법 에 문제 가 있다 고 생각 했 지만 여러 곳 을 조사해 보 았 지만 문제 가 어디 에 있 는 지 찾 지 못 했다.마지막 으로 아예 계산 방법 을 한 마디 한 마디 씩 나 누 어 마지막 으로 가장 간단 한 단 계 를 얻 었 다.바로 두 개의 구체 적 인 수 치 를 더 하 는 것 이다.그러나 마지막 결 과 는 잘못된 것 이다.예 를 들 어 지금 은 가장 간단 한 단계 에 이 르 렀 다.

double n = 171.6;
double m = 28.17;
double k = n + m;
이치 에 따 르 면 k 의 수 치 는 199.77 이 어야 하지만 사실은 199.7699999998 이다.
     우리 시스템 에는 소수 자릿수 를 4 자리 로 유지 하고 있 으 며,이치 에 따 르 면 반올림 하여 199.77 로 할 수 있다.그러나 금액 의 합계 가 있 기 때문에 수 십,심지어 수백 개의 데 이 터 를 더 한 것 이다.두 개의 수 를 더 할 때 이런 오차 가 발생 할 수 있 기 때문에 마지막 에 얻 은 결 과 는 0.7 에 가 까 운 오차 가 있 기 때문에 반올림 을 하 더 라 도 도움 이 되 지 않 는 다.
     인터넷 에서 관련 자 료 를 찾 아 보 니 CSDN 게시판 의 이 게시 물의 설명 이 비교적 상세 하 다 고 생각 합 니 다.http://bbs.csdn.net/topics/300023952대 의 는 연산 할 때 진법 전환 을 해서 생 긴 것 이다(8 층 답장 참조).모든 정밀도 유형 은 거의 모든 언어 에서 이 문제 가 있다.비교적 효과 적 인 해결 방법 은 BigDecimal(14 층 답변 참조)을 사용 하 는 것 이다.그러나 나 는 개인 적 으로 그 BigDecimal 의 해결 방법 이 너무 번거롭다 고 생각한다.적어도 나의 시스템 에 있어 서 는 이렇다.차라리 한 번 더 추가 한 후에 문자열 변환 을 하고 효과 적 인 소수 자릿수 를 유지 하 는 것 이 좋 습 니 다.예 를 들 어 상기 문 구 는 다음 과 같이 바 꿀 수 있 습 니 다.

double n = 171.6;
double m = 28.17;
//double k = n + m;
String kn = (n + m).ToString("N4");    // 4
double k = Convert.ToDouble(kn);
즉,String kn 이라는 단계 에서 오 차 를 조정 하고 얻 은 k 값 이 정확 합 니 다.이렇게 매번 오 차 를 처리 하면 몇 개의 데이터 의 합 계 를 계산 하 더 라 도 오차 가 너무 큰 상황 이 발생 할 까 봐 걱정 할 필요 가 없다.
    물론 이런 처리 방법 을 하나의 공용 방법 으로 만들어 두 수의 합 을 처리 하 는 것 이 가장 좋다.

좋은 웹페이지 즐겨찾기