티스토리 뷰
자바스크립트는 다른 언어와 다르게 정수 값과 실수 값을 구분하지 않는다. 모든 숫자를 64비트 실수로 표현한다. (double이라고 생각하면 될 듯하다) 하지만 배열 인덱싱이나 비트 연산과 같은 특정한 연산은 32비트 정수로 수행한다.
자바스크립트는 10진수 리터럴 외에도 16진수 값을 인식한다. (e.g. 0xff
)
자바스크립트의 산술 연산
자바스크립트의 산술 연산은 오버플로(Overflow), 언더플로(Underflow), 0으로 나누는 에러를 발생시키지 않는다.
산술 연산의 결과가 표현할 수 있는 값보다 더 큰 경우 양수에서는 Infinity라는 무한대 값을 출력하고, 음수에서는 -Infinity를 출력한다.
언더플로는 표현할 수 있는 가장 작은 값보다 0에 더 가까운 값인 경우 발생하는데, 이 때 양수면 0으로, 음수면 특수 값인 음의 0을 반환한다. (-0으로 표현한다.)
0으로 나누는 연산도 무한대의 값을 반환하는 데, 예외적으로 0을 0으로 나누는 경우에는 NaN을 리턴한다.
참고로 NaN이 리턴되는 경우는,
- 0을 0으로 나눌 때
- 무한대를 무한대로 나눌 때
- 숫자가 아닌 피연산자에 산술 연산을 시도할 경우 (e.g. undefined + 1)
- 음수 값에 루트를 씌울 경우 등이다.
부동소수점 오류
부동소수점(floating point
) 리터럴은 소수점을 가질 수 있다. 부동소수점 리터럴은 지수 표기법으로도 표현할 수 있다. 실수에 이어 e 또는 E, 그 뒤로 선택적으로 +나 -가 나타나고 그 뒤에 정수 지수가 나타난다.
6.02e23 // 6.02 * 10^23 (10의 23승)
1.47E-32 // 1.47 * 10^-32 (10의 -32승)
자바스크립트에서 사용하는 부동소수점 표현 방식은 이진 표현법이어서 1/2, 1/1024 와 같은 값은 정확히 표현할 수 있는데, 1/10 같은 값은 정확히 표현할 수 없다.
var x = 0.3 - 0.2; // 0.09999999999999998
var y = 0.2 - 0.1; // 0.1
x === y // false
x === 0.1 // false
y === 0.1 // true
그렇기 때문에 환율 계산과 같이 정확한 계산이 필요한 경우에는 가급적 정수로 변환하여 계산하는 것이 좋다. 예를 들어 소수점이 포함된 달러 대신 정수 값인 센트로 변환하여 사용하는 것이다.
NaN
자바스크립트에서는 숫자가 아닌 값을 표현하기 위해 전역 변수 NaN
을 미리 정의한다. ES5에서 NaN
은 읽기 전용값이다.
NaN의 특이한 점은 다른 모든 값과 비교했을 때 같지 않다는 점이다. 심지어는 자기 자신과도 같지 않은 유일한 값이다.
NaN === NaN // false
Number.NaN === NaN // false
function valueIsNaN(v) { return v !== v; } // 자기 자신과 같지 않은 값은 NaN뿐이다
그래서 NaN인지 아닌지 판별할 때에는 동치 연산자가 아니라 isNaN()
함수를 사용한다. 이 함수는 인자가 NaN이거나 숫자가 아닌 값이라면 true를 반환한다.
하지만 isNaN 함수도 믿을 만하지 못하다. 왜냐하면 isNaN에 주어진 인자를 먼저 숫자로 강제 형변환한 후 판단하기 때문이다. 그래서 '3' 과 같은 문자열도 isNaN에 인자로 넣어주면 false를 리턴한다.
isNaN('') // false. 빈문자열은 숫자로 강제 형변환할 시 0으로 평가되기 때문이다.
isNaN('3') // false
isNaN(3) // false
isNaN('three') // true
isNaN(NaN) // true
isNaN(undefined) // true
'공부일지(TIL) > JavaScript' 카테고리의 다른 글
[JavaScript] 콜백 함수의 this (0) | 2021.04.01 |
---|---|
[JavaScript] Getter (0) | 2021.04.01 |
[JavaScript] 어휘 구조 (0) | 2021.03.23 |
[JavaScript] Protobuf 직렬화 (0) | 2021.03.18 |
[TypeScript] 타입과 인터페이스의 차이 (0) | 2021.03.18 |
- Total
- Today
- Yesterday
- 포인터 변수
- react
- Java
- youtube data api
- 알고리즘
- 리덕스
- GIT
- 제네릭스
- Session
- Conflict
- useEffect
- c언어
- oracle
- JavaScript
- linkedlist
- Prefix Sums
- 깃
- this
- Redux
- jQuery
- rxjs
- SQL
- 개발 공부
- getter
- 자바
- til
- 인스턴스
- CSS
- package.json
- Data Structure
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |