개발꿀팁 소수점 데이터 계산 시 값이 틀리다면?
추천2 비추천 0
페이지 정보
작성자 GCK루카스 작성일 2023-01-11 15:08 조회 506회 댓글 1건본문
첨부파일
관련링크
SpreadJS를 사용하다 보면 간혹 소수점 데이터를 가진 값을 이용해 계산을 할 때 아주 작은 소수점 부분이 틀린 경우를 볼 수 있습니다.
이는 실수 데이터를 계산할 때 부동 소수점 방식을 반영하기 때문에 발생하는 버그입니다.
이러한 버그는 SpreadJS뿐만 아니라 IEEE745를 채택하는 모든 컴퓨터에서 발생하는 버그입니다.
따라서, 엑셀에서도 동일한 문제가 발생합니다.
간단한 예를 보면,
위의 엑셀 이미지에서 B3 셀의 값과 B4의 셀 값은 모두 0.27로 같아 보이지만 그 둘을 비교해보면 FALSE가 나옵니다.
두 셀의 소수점을 펼쳐보면 아래와 같이 나타납니다.
이를 방지하기 위해 많은 유저들이 ROUND 함수를 사용하고 있습니다.
그럼, SpreadJS에서는 어떻게 이를 방지할 수 있을까요?
마찬가지로 SpreadJS에서도 ROUND 함수를 사용할 수 있습니다.
SpreadJS는 그 외에 다른 방법이 한 가지 더 있습니다.
아래 샘플과 같이 소수점 13번째 자리까지만 계산되도록 설정할 수 있습니다.
엑셀 파일을 불러오는 경우에는 "GC.Spread.CalcEngine.Functions.CALC_PRECISION = 13"를 사용하더라도 재계산을 하지 않도록 하는 doNotRecalculateAfterLoad 옵션을 사용하면 버그가 발생한 값을 표기합니다.
이는 이미 엑셀이 버그가 발생된 값을 가지고 있기 때문입니다.
그렇기 때문에 반드시 doNotRecalculateAfterLoad 옵션을 false로 설정하여 SpreadJS에서 다시 계산될 수 있도록 해야 합니다.