1HOON
논리적 코딩
1HOON
전체 방문자
오늘
어제
  • HOME (186)
    • ☕️ JAVA (28)
      • WhiteShip Java LIVE Study (6)
      • Effective JAVA (10)
    • 🔮 KOTLIN (4)
    • 🌱 SPRING (51)
      • 스프링 인 액션 (22)
      • JPA (18)
    • ☕️ JAVASCRIPT (6)
    • 📃 DATABASE (40)
      • ORACLE (37)
      • MSSQL (2)
    • 🐧 LINUX (4)
    • 🐳 DOCKER (5)
    • 🐙 KUBERNETES (4)
    • 🏗️ ARCHITECTURE (8)
    • 📦 ETC (26)
      • TOY PROJECT (5)
      • RECRUIT (1)
      • 그냥 쓰고 싶어서요 (14)
    • 🤿 DEEP DIVE (1)
    • 🚽 Deprecated (9)
      • PYTHON (3)
      • AWS (2)
      • HTTP 완벽가이드 (3)
      • WEB (1)

블로그 메뉴

  • 홈
  • 방명록
  • 관리

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
1HOON

논리적 코딩

☕️ JAVASCRIPT

자바스크립트에서 소수점 계산이 이상하다??

2019. 8. 30. 23:33

자바스크립트에서 소수점 숫자를 덧셈 계산했을 때, 전혀 생각지도 못한 문제가 발생했다.

 

0.1 + 0.2 를 수행한 결과가 0.3이 아닌 0.30000000000000004 가 나오는 것이다!

 

다른 숫자를 더해봐도 결과는 마찬가지였다. 소수점 숫자끼리의 덧셈에서 정확한 값이 반환되지 않는것이다.

믿기지 않는다면 지금 바로 F12를 눌러 개발자도구를 열어 아래 코드를 실행해보자.

 

1
2
3
4
5
6
var a = 0.1;
var b = 0.2;
 
var result = a + b;
 
console.log(result);
cs

 

결과는 본문과 같이 0.30000000000000004 일 것이다.

그래서 이렇게 포스팅을 하게되었다.

 

Javascript는 IEEE 754 를 기반으로 하고있기 때문에 64bit의 소숫점 숫자를 사용한다. 이것이 소수점 계산에서 정밀도 부분에 있어 오류를 발생시키는데, 십진법 기반의 숫자와 달리 컴퓨터는 이진법으로 동작하기 때문이다.

 

그렇다면 해결방법은 무엇이 있을까? 두 가지 해결 방법이 있는데, 모두 결과값을 반올림하는 매커니즘이다.

대부분의 경우 소수점 12번째 자리에서 반올림을 한다.

 

 

toFixed()

toFixed()는 대상 소수점 숫자를 매개변수만큼 자리수로 반올림해 String으로 반환해주는 함수이다.

 

1
2
3
4
5
6
var a = 0.1;
var b = 0.2;
 
var result = (a + b).toFixed(2);
 
console.log(result);
cs

 

위 코드를 실행하면 0.30이 반환된다. 만약 result 를 바로 문자열이 아닌 숫자로 인식하면 계산식 맨 앞에 + 연산자를 붙이면된다.

 

1
2
3
4
5
6
var a = 0.1;
var b = 0.2;
 
var result = +(a + b).toFixed(2);
 
console.log(result);
cs

 

이 코드에서는 0.3이 반환될 것이다.

 

1
2
3
4
5
6
var a = 0.1;
var b = 0.2;
 
var result = +(a + b).toFixed(12);
 
console.log(result);
cs

 

 

Math.round()

Math.round()는 함수명에서 말해주듯이 반올림 함수이다. 

 

1
2
3
4
5
6
var a = 0.1;
var b = 0.2;
 
var result = Math.round((a+b) * 100) / 100;
 
console.log(result);
cs

 

1
2
3
4
5
6
var a = 0.1;
var b = 0.2;
 
var result = Math.round((a+b) * 1e12) / 1e12;
 
console.log(result);
cs

 

 


참고 사이트

https://stackoverflow.com/questions/588004/is-floating-point-math-broken

 

Is floating point math broken?

Consider the following code: 0.1 + 0.2 == 0.3 -> false 0.1 + 0.2 -> 0.30000000000000004 Why do these inaccuracies happen?

stackoverflow.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'☕️ JAVASCRIPT' 카테고리의 다른 글

HTML Entities 치환 라이브러리, html-entities  (0) 2022.07.19
도로명주소 API 연동하기  (0) 2019.10.05
[TYPES & GRAMMAR] 챕터 2 : VALUES - Array  (0) 2019.08.22
[TYPES & GRAMMAR] 챕터 1 : TYPES  (1) 2019.02.06
eval() 과 new Function()  (0) 2018.08.27
    '☕️ JAVASCRIPT' 카테고리의 다른 글
    • HTML Entities 치환 라이브러리, html-entities
    • 도로명주소 API 연동하기
    • [TYPES & GRAMMAR] 챕터 2 : VALUES - Array
    • [TYPES & GRAMMAR] 챕터 1 : TYPES
    1HOON
    1HOON

    티스토리툴바