본문 바로가기
front-end/javascript

[javascript] 바나나 문제 / 0.1+0.2 === 0.3이 틀린 이유

by MOOB 2020. 1. 29.

자바스크립트 :: 바나나

자바스크립트를 헷갈리게 하는 몇가지 문제들을 소개해본다.

    console.log('b' + 'a' ++ 'a' + 'a').toLowerCase();

    //banana

첫 글자 ba 는 문자열이므로 쉽게 ba 로 변환된다. 그러나 그 다음 ++ 'a' 에서 첫번째 + 기호는 이전 문자열 더하기와 같은 기능을 수행하지만 뒤에 있는 +는 문자열을 숫자로 바꾸는 unary operator로의 역할을 한다. 그러나 뒤에 따라 붙는 a는 숫자로 변환할 수 없으므로 NaN 이 반환되게 되는데 이것이 toLowerCase() 에 의해 소문자로 변해 최종적으로 banana 가 출력된다.

배열 더하기

    console.log([1, 2, 3]+[4, 5, 6]);

    //1, 2, 34, 5, 6

이 배열은 먼저 string 으로 변환된 후 더해진다. 위 코드는 "1, 2, 3" + "4, 5, 6"과 같은 기능을 수행한다.

func()는 함수가 아니다

func ≠func()

    function func(){
      return something
    }

    func();

함수를 가리키는 것은 func
func()는 함수에 대한 참조 또는 함수의 리턴 값을 나타낸다
onclick은 따옴표 안에서 식을 function으로 한 번 감싸주기 때문에 사실 식이 들어가는 곳임 func()를 넣으면 func()를 실행하는 함수가 실행될 뿐이다.

0.1+0.2 !== 0.3

가장 자주 인용되는 문제이다.

console.log(0.1 + 0.2); // 0.30000000000000004

이 문제는 floating-point를 사용하는 모든 언어에서 발생하는 문제이다. 이 언어들은 숫자를 표현하는데 정해진 비트 수가 있는데 0.1과 0.2는 2진수로 나타낼 때 정확히 나누어 떨어지지 않아 무한히 이어지게 되므로 일정 소수점 자리에서 한 번 반올림 된다.
0.1+0.2는 0.1과 0.2에 해당하는 2진수를 더한 후 반올림 한 수(실제보다 약간 커진다.)이며 0.3은 0.3을 반올림 한 수 이므로 두 값은 다르게 나온다.

댓글