👋 Hello, I am Seung-ho Ham

🧑🏻‍💻 A Developers who create code that changes the world

카테고리 없음

[DEV] 자바스크립트 소수점 오류

Potato_H 2021. 5. 2. 08:33
반응형
0.1 + 0.2 = 0.30000000000000004 ??

자바스크립트에서 실수의 연산 중 일부의 경우는 소수점이 오류가 난다.

 

사람은 10진수를 쓰지만 컴퓨터는 사람과 다르게 2진수를 사용한다.

 

그러므로 10진수를 2진수로 바꿔주어야 컴퓨터가 알아들을 수 있다.

 

2진수는 0과 1 두가지로만 표현하며 2진수와 10진수의 관계는 다음과 같다.

 

 
*빨간색은 2진수

8 (=2의3승) 1000
4 (=2의2승) 0100
2 (=2의1승) 0010
1 (=2의 0승) 0001

0.5 (=2의 -1승) 0.1000
0.25 (=2의 -2승) 0.0100
0.125 (=2의 -3승) 0.0010

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가 나오는 것이다.

 

즉 소수에선 이런 숫자들의 조합으로 표현하기에 오차가 발생할수 있다.