삶 가운데 남긴 기록 AACII.TISTORY.COM
javascript Expression 본문
부동 소수점 실수 계산의 정확도 문제
64비트 부동 소수점 규격
부호: 1비트, 지수 부분: 11비트, 가수 부분: 52비트
유효 소수점 자리수가 2의 53승 이므로 약 10의 16승 즉, 16자리가 유효한 자릿수입니다.
부동 소수점으로 계산하면 오차가 발생합니다.
일반적으로 가까운 두 수를 뺄 때 정밀도에 손실이 일어납니다.
Math.sqrt(10001) - Math.sqrt(10000); //유효자리가 16자리에서 12자리로 줄어듭니다.
//이런 경우 아래 처럼 바꾸어 정밀도 손실을 피할 수 있습니다.
1 / (Math.sqrt(10001) + Math.sqrt(10000))
10진수로 정확하게 딱 떨어지는 값도 계산 결과가 어긋나는데 내부적으로는 이진수로 계산하기 때문입니다.
var a = 0.16;
var b = 0.2;
console.log(a/b); //a / b = 0.8 이지만 0.79999999999 처럼 나옵니다.
console.log((a/b) == 0.8) //false 가 나옵니다.
//숫자를 비교하는 경우 아래와 같이 비교해서 문제를 피합니다.
Math.abs(a/b - 0.8) < 1e-10;
비교 연산자 주의 할 점
var a = [1,2,3];
var b = [1,2,3];
var c = a;
console.log(a == b); //false : 참조하는 객체가 다름
console.log(a == c); //true : 참조하는 객체와 값이 모두 같음
데이터 타입이 다른 경우 비교
console.log(null == undefined); //true
console.log(1 == "1"); //true
console.log("0xff" == 255); //true
console.log(true == 1); //true
console.log(true == "1"); //true
console.log((new String("a") == "a"); //true
console.log((new Number(2) == 2); //true
console.log([2] == 2); //true
동치(일치) 연산자
console.log(null === undefined); //false
console.log(1 === "1"); //false
console.log("0xff" === 255); //false
console.log(true === 1); //false
console.log(true === "1"); //false
console.log((new String("a") === "a"); //false
console.log((new Number(2) === 2); //false
console.log([2] === 2); //false
비트 논리 연산
& | 비트 논리곱 (AND) |
| | 비트 논리합 (OR) |
^ | 배타적 논리합 (XOR) |
~ | 부정 (NOT) |
<< | 좌측 시프트 (빈자리는 0으로 채우고 overflow는 버림) |
>> | 부호 있는 우측 시프트 (빈자리는 부호비트로 채우고 overflow는 버림) |
>>> | 부호 없는 우측 시프트 (빈자리는 0으로 채우고 overflow는 버림) |
eval()
문자열을 javascript 코드로 변환해주는 함수이지만 사용자가 악의적으로 eval 함수에 인수로 악성코드를 넘겨 보안 문제가 발생할수 있고 속도 또한 느리기 때문에 사용하지 않는 것을 추천합니다.
728x90
'DEV&OPS > Javascript' 카테고리의 다른 글
javascript 함수 (0) | 2022.02.21 |
---|---|
javascript 브라우저 입출력 (0) | 2022.02.21 |
javascript object (0) | 2022.02.21 |
javascript ECMAScript 6에 추가된 데이터 타입 (0) | 2022.02.21 |
html xml 특수기호 (0) | 2022.02.21 |