Show helpful blog자바스크립트 소수점 계산 오류 본문자바스크립트에서 0.1 + 0.2의 결괏값은?답은 0.3이 아닌 0.30000000000000004이다. 그 이유는 자바스크립트 숫자 타입의 값이 IEEE 754의 부동소수점 표현 형식 중 배정밀도 64비트 부동소수점 형식을 따르기 때문이다. C나 자바의 경우, 정수와 실수를 구분해서 int, long, float, double 등과 같은 타입으로 정수와 실수를 구분해서 사용하지만, 자바스크립트의 경우 모든 수를 실수로 처리하기 때문에 하나의 숫자 타입만 존재한다. 옛날에는 컴퓨터의 성능이 좋지 않았기 때문에 이렇게 숫자의 타입의 크기를 지정해서 메모리를 효율적으로 사용하기 위해 타입이 분류되었다. 하지만 점점 컴퓨터의 성능이 좋아지면서 타입에 대해 덜 신경 쓰게 되었다. 배정밀도 64비트 부동소수점 부호부분자바스크립트의 숫자 표현은 배정밀도 64비트 부동소수점 형식을 따른다고 했다. 여기서 부동소수점의 부동은 뜰부(浮)에 움직일동(動)이다. 즉 떠돌이 소수점(floating point)이란 뜻이다. 부동소수점 표현은 크게 세 부분으로 구성되는데 부호 부분, 지수 부분, 가수 부분이 있다. 0.1(십진법)을 배정밀도 64비트 부동소수점 형식으로 표현하는 방법은 아래와 같다. - 부호부분
- 지수부분
- 가수부분
IEEE 754란?
※ binary = 2진법, bit = binary(2진법의) digit(숫자)의 약자, decimal = 10진법 결론자바스크립트는 숫자를 배정밀도 64비트 부동소수점 형식을 따라 표현한다. 이것은 십진수인 소수를 이진수로 변환하고 소수점을 1이 나올 때까지 오른쪽 또는 왼쪽으로 옮긴 다음, 소수점 오른쪽에 해당하는 수를 가수부분에 넣게 되는데 이 수가 표현 자리수보다 넘어서게 되면 나머지 부분에서 반올림 처리를 하므로 근사값이 저장되면서 부정확하게 된다. 따라서 0.1 + 0.2의 결괏값이 0.30000000000000004가 나오게 되는 것이다. 소수점의 계산을 올바르게 하는 방법- numObj.toFixed([digits])
- Math.round(x)
이것을 응용해 0.3을 만들 수 있다. 참고자바스크립트의 실수 계산 오류 자바스크립트에서 0.1과 0.2를 더하면 0.3이 아닌 0.30000000000000004가 나온다. 도대체 왜 이럴까? medium.com 전기 전자 기술자 협회 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 전기 전자 기술자 협회(Institute of Electrical and Electronics Engineers, IEEE)는 전기전자공학 전문가들의 국제조직이다. IEEE는 'I-Triple-E'(아이 트리플 이)라고 발음하며, ko.wikipedia.org IEEE 754 From Wikipedia, the free encyclopedia Jump to navigation Jump to search IEEE Standard for floating-point arithmetic The IEEE Standard for Floating-Point Arithmetic (IEEE 754) is a technical standard for floating-point arithmetic established in 1985 by the en.wikipedia.org Number.prototype.toFixed() - JavaScript | MDN Number.prototype.toFixed() toFixed() 메서드는 숫자를 고정 소수점 표기법으로 표기해 반환합니다. The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples projec developer.mozilla.org |