Recent Posts
Recent Comments
Link
06-30 12:53
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

javascript Expression 본문

DEV&OPS/Javascript

javascript Expression

ALEPH.GEM 2022. 2. 21. 17:00

부동 소수점 실수 계산의 정확도 문제 

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