[πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒ] 28μž₯. Number

λ…Έμ˜μ™„Β·2024λ…„ 1μ›” 18일
0

JavaScript(Deep Dive)

λͺ©λ‘ 보기
23/23
post-thumbnail
post-custom-banner

Number

ν‘œμ€€ 빌트인 객체인 NumberλŠ” μ›μ‹œ νƒ€μž…μΈ 숫자λ₯Ό λ‹€λ£° λ•Œ μœ μš©ν•œ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

1. Number μƒμ„±μž ν•¨μˆ˜

ν‘œμ€€ 빌트인 객체인 Number κ°μ²΄λŠ” μƒμ„±μž ν•¨μˆ˜ 객체닀. λ”°λΌμ„œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜μ—¬ Number μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€.

const numObj = new Number();
console.log(numObj); // Number {[[PrimitiveValue]]: 0}

인수λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šκ³  ν˜ΈμΆœν•˜λ©΄ [[NumberData]] λ‚΄λΆ€ μŠ¬λ‘―μ— 0을 ν• λ‹Ήν•œ Number 래퍼 객체λ₯Ό 생성.

인수둜 숫자λ₯Ό μ „λ‹¬ν•˜λ©΄ [[NumberData]] λ‚΄λΆ€ μŠ¬λ‘―μ— 인수λ₯Ό ν• λ‹Ήν•œ Number 래퍼 객체λ₯Ό 생성.

const numObj = new Number(10);
console.log(numObj); // Number {[[PrimitiveValue]]: 10}

인수둜 μˆ«μžκ°€ μ•„λ‹Œ 값을 μ „λ‹¬ν•˜λ©΄ 숫자둜 κ°•μ œ λ³€ν™˜ ν›„ μ „λ‹¬ν•œλ‹€.

let numObj = new Number('10');
console.log(numObj); // Number {[[PrimitiveValue]]: 10}

numObj = new Number('Hello');
console.log(numObj); // Number {[[PrimitiveValue]]: NaN}

λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜ μˆ˜λ‹¨μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

// λ¬Έμžμ—΄ νƒ€μž… => 숫자 νƒ€μž…
Number('0');     // -> 0
Number('-1');    // -> -1
Number('10.53'); // -> 10.53

// λΆˆλ¦¬μ–Έ νƒ€μž… => 숫자 νƒ€μž…
Number(true);  // -> 1
Number(false); // -> 0

2. Number ν”„λ‘œνΌν‹°

2-1. Number.EPSILON

ES6μ—μ„œ λ„μž…λœ Number.EPSILON은 1κ³Ό 1보닀 큰 숫자 μ€‘μ—μ„œ κ°€μž₯ μž‘μ€ μˆ«μžμ™€μ˜ 차이와 κ°™λ‹€.

Number.EPSILON은 λΆ€λ™μ†Œμˆ˜μ μœΌλ‘œ 인해 λ°œμƒν•˜λŠ” 였차λ₯Ό ν•΄κ²°ν•˜κΈ° 이해 μ‚¬μš©ν•œλ‹€.

0.1 + 0.2; // -> 0.30000000000000004
0.1 + 0.2 === 0.3; // -> false
function isEaual(a, b){
	// a와 bλ₯Ό λΊ€ κ°’μ˜ μ ˆλŒ€κ°’μ΄ Number.EPSILON보닀 μž‘μœΌλ©΄ 같은 수둜 μΈμ •ν•œλ‹€.
  	return Math.abs(a - b) < Number.EPSILON
}

isEqual(0.1 + 0.2, 0.3); // true

πŸ’‘ μ†Œμˆ˜μ  계산 였λ₯˜ (λΆ€λ™μ†Œμˆ˜μ )

0.1 + 0.2; // -> 0.30000000000000004
0.1 + 0.2 === 0.3; // -> false

μš°λ¦¬κ°€ 보톡 계산 ν• λ•Œ μ‚¬μš©ν•˜λŠ” 10진법과 달리 μ»΄ν“¨ν„°λŠ” 2μ§„λ²•μœΌλ‘œ λ™μž‘ν•˜λŠ”λ°, λͺ‡λͺ‡ μ†Œμˆ˜λŠ” 10μ§„λ²•μ—μ„œ 2μ§„λ²•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” κ³Όμ •μ—μ„œ λ¬΄ν•œ μ†Œμˆ˜κ°€ λ˜μ–΄λ²„λ¦°λ‹€.

μ €μž₯곡간에 ν•œκ³„κ°€ μžˆλŠ” μ»΄ν“¨ν„°λŠ” λ¬΄ν•œ μ†Œμˆ˜λ₯Ό μœ ν•œ μ†Œμˆ˜λ‘œ λ°”κΎΈκ²Œ λ˜λŠ”λ°,
이 κ³Όμ •μ—μ„œ λ―Έμ„Έν•œ μ˜€μ°¨κ°€ λ°œμƒν•΄μ„œ 였λ₯˜κ°€ λ°œμƒν•œ 것이닀. (정밀도 문제)

2-2. Number.MAX_VALUE

Number.MAX_VALUEλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν‘œν˜„ν•  수 μžˆλŠ” κ°€μž₯ 큰 μ–‘μˆ˜ κ°’(1.7976931348623157e+308)이닀. Number.MAX_VALUE보닀 큰 μˆ«μžλŠ” Infinityλ‹€.

Number.MAX_VALUE; // -> 1.7976931348623157e+308
Infinity > Number.MAX_VALUE; // -> true

2-3. Number.MIN_VALUE

Number.MIN_VALUEλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν‘œν˜„ν•  수 μžˆλŠ” κ°€μž₯ μž‘μ€ μ–‘μˆ˜ κ°’(5e-324)이닀. Number.MIN_VALUE보닀 μž‘μ€ μˆ«μžλŠ” 0이닀.

Number.MIN_VALUE; // 5e-324
Number.MIN_VALUE > 0; // true

2-4. Number.MAX_SAFE_INTEGER

Number.MAX_SAFE_INTEGERλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ•ˆμ „ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλŠ” κ°€μž₯ 큰 μ •μˆ˜κ°’(9007199254740991)

Number.MAX_SAFE_INTEGER // 9007199254740991

2-5. Number.MIN_SAFE_INTEGER

Number.MIN_SAFE_INTEGERλŠ” μžλ°”μŠ€ν¬λ¦½ν…Œμ—‡ μ•ˆμ „ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλŠ” κ°€μž₯ μž‘μ€ μ •μˆ«κ°’(-9007199254740991)이닀.

Number.MIN_SAFE_INTEGER // -9007199254740991

2-6. Number.POSITIVE_INFINITY

Number.POSITIVE_INFINITYλŠ” μ–‘μ˜ λ¬΄ν•œλŒ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μˆ«μžκ°’ Infinity와 κ°™λ‹€.

Number.POSITIVE_INFINITY; // -> Infinity

2-7. Number.NEGATIVE_INFINITY

Number.NEGATIVE_INFINITYλŠ” 음의 λ¬΄ν•œλŒ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μˆ«μžκ°’ -Infinity와 κ°€λ‹€.

Number.NEGATIVE_INFINITY; // -> -Infinity

2-8. Number.NaN

Number.NaN은 μˆ«μžκ°€ μ•„λ‹˜μ„ λ‚˜νƒ€λ‚΄λŠ” μˆ«μžκ°’.

Number.NaN; // -> NaN

3. Number λ©”μ„œλ“œ

3-1. Number.isFinite

ES6μ—μ„œ λ„μž…λœ Number.isFinite 정적 λ©”μ„œλ“œλŠ” 인수둜 μ „λ‹¬λœ μˆ«μžκ°’μ΄ 정상적인 μœ ν•œμˆ˜, 즉 Infinity λ˜λŠ” -Infinityκ°€ μ•„λ‹Œμ§€ κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.

// μΈμˆ˜κ°€ 정상적인 μœ ν•œμˆ˜μ΄λ©΄ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
Number.isFitite(0); // -> true
Number.isFitite(Number.MAX_VALUE); // -> true
Number.isFitite(Number.MIN_VALUE); // -> true

// μΈμˆ˜κ°€ λ¬΄ν•œμˆ˜μ΄λ©΄ falseλ₯Ό λ°˜ν™˜ν•œλ‹€.
Number.isFitite(Infinity); // -> false
Number.isFitite(-Infinity); // -> false

λ§Œμ•½ μΈμˆ˜κ°€ NaN이면 μ–Έμ œλ‚˜ falseλ₯Ό λ°˜ν™˜ν•œλ‹€.

Number.isFitite(NaN); // -> false 
// Number.isFiniteλŠ” 인수λ₯Ό 숫자둜 암묡적 νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
Number.isFinite(null); // -> false

// isFiniteλŠ” 인수λ₯Ό 숫자둜 암묡적 νƒ€μž… λ³€ν™˜ν•œλ‹€. null은 0으둜 암묡적 νƒ€μž… λ³€ν™˜λœλ‹€.
isFinite(null); // -> true

3-2. Number.isInteger

ES6μ—μ„œ λ„μž…λœ Number.isInteger 정적 λ©”μ„œλ“œλŠ” 인수둜 μ „λ‹¬λœ μˆ«μžκ°’μ΄ μ •μˆ˜μΈμ§€ κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ λ°˜ν™˜λœλ‹€. κ²€μ‚¬ν•˜κΈ° 전에 인수λ₯Ό 숫자둜 암묡적 νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.

// μΈμˆ˜κ°€ μ •μˆ˜μ΄λ©΄ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
Number.isInteger(0); // -> true
Number.isInteger(123); // -> true
Number.isInteger(-123); // -> true

// 0.5λŠ” μ •μˆ˜κ°€ μ•„λ‹ˆλ‹€
Number.isInteger(0.5); // -> false
// '123'을 숫자둜 암묡적 νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
Number.isInteger('123'); // -> false
// falseλ₯Ό 숫자둜 암묡적 νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
Number.isInteger(false); // -> false
// Infinity/-InfinityλŠ” μ •μˆ˜κ°€ μ•„λ‹ˆλ‹€.
Number.isInteger(Infinity); // -> false
Number.isInteger(-Infinity); // -> false

3-3. Number.isNaN

ES6μ—μ„œ λ„μž…λœ Number.isNaN 정적 λ©”μ„œλ“œλŠ” 인수둜 μ „λ‹¬λœ μˆ«μžκ°’μ΄ NaN인지 κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ λ°˜ν™˜ν•œλ‹€.

// μΈμˆ˜κ°€ NaN이면 trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
Number.isNaN(NaN); // -> true
// isNaN은 인수λ₯Ό 숫자둜 암묡적 νƒ€μž… λ³€ν™˜ν•œλ‹€. undefinedλŠ” NaN으둜 암묡적 νƒ€μž… λ³€ν™˜λœλ‹€.
isNaN(undefined); // -> true

3-4. Number.isSafeInterger

ES6μ—μ„œ λ„μž…λœ Number.isSafeInterger 정적 λ©”μ„œλ“œλŠ” 인수둜 μ „λ‹¬λœ μˆ«μžκ°’μ΄ μ•ˆμ „ν•œ μ •μˆ˜μΈμ§€ κ²€μ‚¬ν•˜μ—¬ κ·Έ κ²°κ³Όλ₯Ό λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ λ°˜ν™˜ν•œλ‹€. 검사전에 인수λ₯Ό 숫자둜 암묡적 νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.

// 0은 μ•ˆμ „ν•œ μ •μˆ˜μ΄λ‹€.
Number.isSafeInteger(0); // -> true
// 1000000000000000은 μ•ˆμ „ν•œ μ •μˆ˜μ΄λ‹€.
Number.isSafeInteger(1000000000000000); // -> true

// 10000000000000001은 μ•ˆμ „ν•˜μ§€ μ•Šλ‹€.
Number.isSafeInteger(10000000000000001); // -> false
// 0.5은 μ •μˆ˜κ°€ μ•„λ‹ˆλ‹€.
Number.isSafeInteger(0.5); // -> false
// '123'을 숫자둜 암묡적 νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
Number.isSafeInteger('123'); // -> false
// falseλ₯Ό 숫자둜 암묡적 νƒ€μž… λ³€ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
Number.isSafeInteger(false); // -> false
// Infinity/-InfinityλŠ” μ •μˆ˜κ°€ μ•„λ‹ˆλ‹€.
Number.isSafeInteger(Infinity); // -> false

3-5. Number.prototype.toExponential

toExponential λ©”μ„œλ“œλŠ” 숫자λ₯Ό μ§€μˆ˜ ν‘œκΈ°λ²•μœΌλ‘œ λ³€ν˜Έλ‚˜ν•˜μ—¬ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•œλ‹€.

(77.1234).toExponential();  // -> "7.71234e+1"
(77.1234).toExponential(4); // -> "7.7123e+1"
(77.1234).toExponential(2); // -> "7.71e+1"
77.toExponential(); // -> SyntaxError: Invalid or unexpected token

3-6. Number.prototype.toFixed

toFixed λ©”μ„œλ“œλŠ” 숫자λ₯Ό λ°˜μ˜¬λ¦Όν•˜μ—¬ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€. λ°˜μ˜¬λ¦Όν•˜λŠ” μ†Œμˆ˜μ  μ΄ν•˜ 자릿수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 0 ~ 20 μ‚¬μž‰μ˜ μ •μˆ˜κ°’μ„ 인수둜 전달할 수 μžˆλ‹€. 인수λ₯Ό μƒλž΅ν•˜λ©΄ κΈ°λ³Έκ°’ 0이 μ§€μ •λœλ‹€.

// μ†Œμˆ˜μ  μ΄ν•˜ 반올림. 인수λ₯Ό μƒλž΅ν•˜λ©΄ κΈ°λ³Έκ°’ 0이 μ§€μ •λœλ‹€.
(12345.6789).toFixed(); // => "12346"
// μ†Œμˆ˜μ  μ΄ν•˜ 1자릿수 유효, λ‚˜λ¨Έμ§€ 반올림
(12345.6789).toFixed(1); // "12345.7"
// μ†Œμˆ˜μ  μ΄ν•˜ 2자릿수 유효, λ‚˜λ¨Έμ§€ 반올림
(12345.6789).toFixed(2); // "12345.68"
// μ†Œμˆ˜μ  μ΄ν•˜ 3자릿수 μš”νœ΄, λ‚˜λ¨Έμ§€ 반올림
(12345.6789).toFixed(3); // "12345.679"

3-7. Number.prototype.toPrecision

toPrecision λ©”μ„œλ“œλŠ” 인수둜 전달받은 전체 μžλ¦Ώμˆ˜κΉŒμ§€ μœ νš¨ν•˜λ„λ‘ λ‚˜λ¨Έμ§€ 자릿수λ₯Ό λ°˜μ˜¬λ¦Όν•˜μ—¬ λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€.

// 전체 자리수 유효. 인수λ₯Ό μ „λ‹¬ν•˜μ§€ μ•ŠμœΌλ©΄ κΈ°λ³Έκ°’ 0이 μ „λ‹¬λœλ‹€.
(12345.6789).toPrecision(); // -> "12345.6789"
// 전체 1자리수 유효, λ‚˜λ¨Έμ§€ 반올림
(12345.6789).toPrecision(1); // -> "1e+4"
// 전체 2자리수 유효, λ‚˜λ¨Έμ§€ 반올림
(12345.6789).toPrecision(2); // -> "1.2e+4"
// 전체 6자리수 유효, λ‚˜λ¨Έμ§€ 반올림
(12345.6789).toPrecision(6); // -> "12345.7"

3-8. Number.prototype.toString

toString λ©”μ„œλ“œλŠ” 숫자λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€.

// 인수λ₯Ό μƒλž΅ν•˜λ©΄ 10μ§„μˆ˜ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
(10).toString(); // -> "10"
// 2μ§„μˆ˜ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
(16).toString(2); // -> "10000"
// 8μ§„μˆ˜ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
(16).toString(8); // -> "20"
// 16μ§„μˆ˜ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
(16).toString(16); // "10"
post-custom-banner

0개의 λŒ“κΈ€