21. 산술 연산자(-, *, /, % 연산자)
- 연산자
- 왼쪽 표현식 평가 결과에서 오른쪽 표현식 평가 결과를 뺍니다.
- String 타입이지만, 값이 숫자면 Number 타입으로 변환하여 계산
console.log("135" - 2); // 133
- “135”가 String 타입이지만 값이 숫자이므로
- 값을 Number 타입으로 변환하여 계산
* 연산자
- 왼쪽 표현식 평가 결과와 오른쪽 표현식 평가 결과를 곱합니다.
- 숫자 값으로 변환할 수 있으면 변환하여 곱합니다.
NaN 반환
양쪽의 평가 결과가 하나라도 숫자가 아닐 때
console.log(10 * "20"); // 200 console.log(10 * true); // 10 console.log(10 * false); // 0 console.log(10 * null); // 0 console.log(10 * "A"); // NaN
- 문자 타입이라도 값이 숫자이면 숫자 타입으로 변환합니다.
- true를 1로 변환
- false, null을 0으로 변환
- 소수 값이 생기는 경우 처리
// IEEE 754 유동 소수점
console.log(2.3 * 3); // 6.8999999999999995
console.log(2.3 * 10 * 3 / 10); // 6.9
- 6.9로 출력되지 않습니다.
- 정상이며, IEEE 754 유동 소수점 처리 때문
대응 방법
- 실수를 정수로 변환하여 값을 구하고
- 다시 정수를 실수로 변환합니다.
/ 연산자
- 왼쪽 표현식 평가 결과를 오른쪽 표현식 평가 결과로 나눕니다.
NaN 반환
- 양쪽의 평가 결과가 하나라도 숫자가 아닐 때
- 분모, 분자 모두 0일 때
분모, 분자가 0일 때
- 분모가 0이면 Infinity 반환
- 분자가 0이면 0 반환
console.log(10 / "20"); // 0.5
console.log(10 / true); // 10
console.log(10 / false); // Infinity
console.log(10 / null); // Infinity
console.log(10 / "A"); // NaN
% 연산자
- 왼쪽 표현식 평가 결과를 오른쪽 표현식 평가 결과로 나누어 나머지를 구합니다.
- 3 % 2의 나머지는 1
console.log(5 % 2.5); // 0
console.log(5 % 2.3); // 0.40000000000000036
console.log((5 * 10 - (2 * 2.3 * 10)) / 10); // 0.4
- 5를 2.5로 나누면 나머지가 0
- 소수 끝에 36이 있는 것은 IEEE 754의 유동 소수점 처리 때문
- 실수를 정수로 변환하여 연산하고 다시 정수를 실수로 변환