Search
Duplicate

Number 오브젝트

1. IEEE 754, 64비트 구성, 값을 구하는 방법, Number상수

IEEE754

자바스크립트는 IEEE754에 정의된 64비트 부동 소수점으로 수를 처리합니다.
64비트로 최소값과 최대값을 처리합니다.
정수와 실수를 구분하지 않습니다. (1 은 1.0으로 처리하고, 1 과 1.2간 연산이 가능합니다. )

64비트 구성

사인 비트
63: 1비트
값이 0이면 양수, 1이면 음수
지수(exponent)
52~ 62: 11qlxm
가수(fraction)
0~51: 52비트 + 1(사인 비트): 53비트

값을 구하는 방법

비트 값은 0 아니면 1입니다. 2^n승 값을 더해 값을 구합니다.
0비트 부터 1, 1, 1이면 1(2^0) + 2(2^1) + 4 = 7

Number상수

safe integer란 지수(e)를 사용하지 않고 나타낼 수 있는 값으로 위 표를 보면 2의 64승이 아닌 2의 53승입니다.
console.log(Number.MAX_SAFE_INTEGER); console.log(Math.pow(2,53)-1); console.log(Number.MIN_SAFE_INTEGER); console.log(-(Math.pow(2,53)-1));
JavaScript
복사
Number.MAX_SAFE_INTEGER: safe integer최대값
Number.MIN_SAFE_INTEGER: safe integer최소값

2. 진수, EPSILON: Number.EPSILON, 진수

Number.EPSILON

Number.EPSILON
2.2204460492503130808472633361816E-16
혹은 2^-52승으로 아주 작은 값을 나타냅니다.
사용 사례
미세한 값 차이형태
⇒ 0.3이 나올것 같지만 실제로 출력해보면 0.30000000000000004이 출력되고 그렇기에 false판정입니다. 이는 JS가 부동 소수점 처리를 하기 때문(IEEE754 준수)인데 이처럼 미세한 값 차이로 일치하지 않을 때 EPSILONE을 사용합니다.
const total = 0.1 + 0.2; console.log(total);//0.30000000000000004 console.log(total === 0.3);//false
JavaScript
복사
0/0으로 NaN가 되는것을 방지합니다.
⇒ 값 차이가 EPSILON 보다 작은 경우 이 값을 무시할 수 있습니다.
const value = Math.abs(0.1 + 0.2 - 0.3); console.log(value < Number.EPSILON);
JavaScript
복사
미세한 값 차이를 같은 값으로 간주합니다.
⇒ 0 / 0은 NaN이지만 0 + Number.EPSILON처럼 작은 값을 더해 나누면 0이되서 그 뒤 연산을 이어서 할 수 있습니다.
console.log(0 / 0); //NAN const value = 0 / (0 + Number.EPSILON); console.log(value);//
JavaScript
복사

진수

Binary(2진수)
0b0101, 0B0101형태로 작성합니다.
숫자 0 다음에 b/B작성 후 나머지 값들 작성
const value = 0B111; console.log(value);//7
JavaScript
복사
Octal(8진수)
0O0105gudxofh wkrtjd
숫자 0 다음에 영문 o/O작성 후 이어서 0~7작성
ES3는 첫 자리에 영문 o/O작성
const value = 0o111; console.log(value);//73
JavaScript
복사

3. Number 함수: isNaN(), isInteger(), isSafeInteger(), isFinite()

isNaN()

Number.isNaN(value)
주어진 값의 유형이 Number이고 NaN이면 true 아니면 false를 반환합니다.
console.log(Number.isNaN("ABC"), isNaN("DEF"));//false true ---(1) console.log(Number.isNaN(NaN), isNaN(NaN));//true true ---(2) console.log(Number.isNaN(0 / 0), isNaN(0 / 0));//true true ---(3) console.log(Number.isNaN("100"), isNaN("200"));//false false---(4)
JavaScript
복사
(1): 글로벌 오브젝트의 isNaN("DEF")값 타입이 Number가 아닌 것을 체크합니다 DEF가 String타입이기에 true Number.isNaN("ABC")는 값이 NaN이 아니기에 false가 반환됩니다.
(2): NaN와 0/0은 값이 NaN이므로 true가 됩니다.
(3): NaN와 0/0은 값이 NaN이므로 true가 반환됩니다.
(4): 글로벌 오브젝트의 isNaN("200")값을 숫자로 변환 후 그 결과로 비교합니다.
NaN체크 방법
NaN === NaN 결과가 false이므로 사용 불가
isNaN(), 글로벌 오브젝트
Number.isNaN()
Object.is(NaN,NaN):true

isInteger()

Number.isInteger(value)
파라미터 값으로 받은 value가 정수인지 확인하려는 값으로 반환타입은 Boolean입니다.
파라미터 값이 정수이면 true아니면 false반환
정수로 인식
⇒ 1.0은 정수이고 1.01은 소수입니다.
console.log(Number.isInteger(0));//true console.log(Number.isInteger(1.0));//true console.log(Number.isInteger(1.01));//false
JavaScript
복사
정수가 아닌 것으로 인식
⇒ "12"는 숫자로 변환하면 Number가 맞지만 Number.isIteger()는 치환하지 않고 값 그대로 판단하기에 false가 반환됩니다.
console.log(Number.isInteger("12")); console.log(Number.isInteger(true));
JavaScript
복사

isSafeInteger()

Number.isSafeInteger(testValue)
파라미터인 testValue가 안전한 정수인지 확인하며 Boolean타입으로 반환합니다.
파라미터 값이 safe 정수이면 true 아니면 false반환
-(2의 53승 -1) ~ (2의 53승 -1): true 아니면 false
true로 인식하는 경우
⇒ 7.0은 정수이며, 값 범위에 속하므로 true
const isSafe = Number.isSafeInteger; console.log(isSafe(7.0)); console.log(isSafe(Number.MAX_SAFE_INTEGER)); console.log(isSafe(Number.MIN_SAFE_INTEGER));
JavaScript
복사
false로 인식하는 경우
⇒ 7.1은 정수가 아닙니다.
⇒ 값을 Number로 변환하여 체크하지 않습니다.
const isSafe = Number.isSafeInteger; console.log(isSafe(7.1)); console.log(isSafe("100")); console.log(isSafe(NaN)); console.log(isSafe(Infinity));
JavaScript
복사

isFinite()

isFinite(testValue)
파라미터 값이 유한한지 확인하는 함수로 유한 값이면true 아니면 false를 반환합니다.
글로벌 오브젝트의 isFinite()와 체크 결과가 다릅니다.
const num = Number.isFinite, global = isFinite; console.log(num(100), global(200)); console.log(num("70"), global("80")); console.log(num(true), global(true)); console.log(num(NaN), global(NaN)); console.log(num(undefined), global(undefined));
JavaScript
복사
함수는 오브젝트에 속해야 하므로 Number 와 관련된것은 Number오브젝트의 함수를 사용하고 글로벌 오브젝트의 함수는 글로벌 사용이 목적입니다.