0.1 + 0.2 = 0.30000000000000004 ?? |
자바스크립트에서 실수의 연산 중 일부의 경우는 소수점이 오류가 난다.
사람은 10진수를 쓰지만 컴퓨터는 사람과 다르게 2진수를 사용한다.
그러므로 10진수를 2진수로 바꿔주어야 컴퓨터가 알아들을 수 있다.
2진수는 0과 1 두가지로만 표현하며 2진수와 10진수의 관계는 다음과 같다.
*빨간색은 2진수
8 (=2의3승) 1000 0.5 (=2의 -1승) 0.1000 0.0625 (=2의 -4승) 0.0001 |
컴퓨터는 위와 같이 2의 n승만 가지고 숫자를 조합하여 나타낸다.
숫자 3을 나타내고 싶으면 1과 2를 더한 0011 인 것이다.
또한 0.375를 나타내려면 0.25와 0.125를 더한 0.0110 인 것이다.
0.1을 2진수로 나타내려면 어떻게 해야할까?
2의-4승 0.0625 0.0001
2의-5승 0.03125 0.00001
이 두개를 더하면 0.09375 0.00011 이다.
근데 2의-6승인 0.015625 0.000001 을 더해주면 0.1을 초과해버린다.
그럼 더 작은 값인 2의-7승을 더하고 -8승도 더해서 0.1을 넘지않고 제일 가까운 수가 될 때까지 더한다.
결국엔 무한하게 계속 더해야만 한다..
0.00011001100110011001100 (11001100 반복..)
Javascript는 IEEE-754 배정 밀도를 사용하는데, 소수점 이하 자릿수 약 15 자리까지만 계산 가능하다.
따라서 15자리까지만 계산하여 무한소수를 유한하게 나타내려고 하기 때문에 값이 손실되거나 초과되는 것이다.
0.2도 0.1과 마찬가지로 무한소수가 나올 것이므로 0.1+0.2를 컴퓨터에게 시키면 0.3000000000000004가 나오는 것이다.
즉 소수에선 이런 숫자들의 조합으로 표현하기에 오차가 발생할수 있다.