[REAL Deep Dive into JS] 28. Number

young_palleteΒ·2022λ…„ 10μ›” 3일
0

REAL JavaScript Deep Dive

λͺ©λ‘ 보기
31/46
post-custom-banner

🚦 본둠

μ–΄λ–»κ²Œ 보면, NumberλŠ” μƒμ„±μž ν•¨μˆ˜μ΄κΈ°λ„ ν•˜μ§€λ§Œ, ν‘œμ€€ 빌트인 객체이기도 ν•©λ‹ˆλ‹€.
μ΄λ ‡κ²Œ 두 개의 λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” μ΄μœ λŠ”, Number μžμ²΄μ— κ΄€ν•œ 정적 λ©”μ„œλ“œμ™€ ν”„λ‘œνΌν‹°λ“€μ„ μ œκ³΅ν•˜μ—¬ 숫자 νƒ€μž…μ˜ 값을 ν•Έλ“€λ§ν•˜λŠ” 데 도움을 μ£ΌκΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

console.log(new Number(123)) // Number {123}
console.log(new Number(true)) // Number {1}
console.log(new Number(undefined)) // Number {NaN}
console.log(new Number(null)) // Number {0}

μœ μ˜μ μ€, μƒμ„±μž ν•¨μˆ˜μΈ 만큼 κ°’ μ—­μ‹œ 객체둜 λ‚˜μ˜΅λ‹ˆλ‹€.
이λ₯Ό κΊΌλ‚΄κΈ° μœ„ν•΄μ„œλŠ” .valueOf λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

console.log(new Number(123).valueOf()) // 123

μ΄λ•Œ νŠΉμ΄ν•œ 점은, new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ new μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄λ•Œμ˜ λ°˜ν™˜κ°’μ€, μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ μˆ«μžκ°’ κ·ΈλŒ€λ‘œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

Number(1234) // 1234

Number.EPSILON

사싀 λΆ€λ™μ†Œμˆ˜μ  μ‚°μˆ  μ—°μ‚°μ˜ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‚˜μ˜¨ 맀우 μž‘μ€ μˆ«μžμ΄μ§€λ§Œ...
가끔 λ§Žμ€ μ—£μ§€μΌ€μ΄μŠ€λ“€μ΄ μ‘΄μž¬ν•˜μ—¬, 사싀상 μ™„λ²½ν•œ κ²€μ¦μ—λŠ” μ’€ 더 λ‹€λ₯Έ λ°©μ‹μ˜ 연산이 ν•„μš”ν•œ μΉœκ΅¬μž…λ‹ˆλ‹€.

참고둜, Number.EPSILON κ°’μ˜ ν¬κΈ°λŠ” 2.220446049250313e-16μž…λ‹ˆλ‹€.

console.log(1.15 + 1.1 < 2.25 + Number.EPSILON) // false

μ±…μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•œλ‹€κ³  λ‚˜μ™€ μžˆμŠ΅λ‹ˆλ‹€.

const isEqual = (a, b) => Math.abs(a - b) < Number.EPSILON;
console.log(isEqual(1.15 + 1.1, 2.25))

Number.MAX_VALUE, Number.MIN_VALUE

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν‘œν˜„ κ°€λŠ₯ν•œ κ°€μž₯ 크고 μž‘μ€ 값을 μ˜λ―Έν•©λ‹ˆλ‹€.

console.log(Number.MAX_VALUE) // 1.7976931348623157e+308
console.log(Number.MIN_VALUE) // 5e-324

Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ•ˆμ „ν•˜κ²Œ ν‘œν˜„ κ°€λŠ₯ν•œ κ°€μž₯ 큰 μ •μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

console.log(Number.MAX_SAFE_INTEGER) // 9007199254740991
console.log(Number.MIN_SAFE_INTEGER) // -9007199254740991

Number.isFinite

ν•΄λ‹Ή 값이 Infinity, -Infinityκ°€ μ•„λ‹Œμ§€λ₯Ό νŒλ³„ν•©λ‹ˆλ‹€.

console.log(Number.isFinite(1/0)) // false;

Number.isInteger

ν•΄λ‹Ή 값이 μ •μˆ˜μΈμ§€λ₯Ό νŒλ³„ν•˜λ„€μš”!
μ΄λ•Œ, νŒλ³„ μ‹œ 암묡적 λ³€ν™˜μ€ μΌμ–΄λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

console.log(Number.isInteger(0.5 + 0.5)) // true;
console.log(Number.isInteger(false)) // false;
console.log(Number.isInteger(true)) // false;
console.log(Number.isInteger(Infinity)) // false;

Number.isNaN

이 μΉœκ΅¬λŠ” 많이 μ“°λŠ” 편이죠.
Numberκ°€ μ•„λ‹Œ κ²°κ³Ό κ°’μ΄λ‚˜, 도쀑에 인수둜 전달 받은 값이 NaNν•œ 값이면 λ¬Έμ œκ°€ λ°œμƒν•΄μ„œ, λ°©μ–΄ μ½”λ“œμš©μœΌλ‘œ 많이 μ‚¬μš©ν•©λ‹ˆλ‹€.

function add(a, b) {
	if (Number.isNaN(a) || Number.isNaN(b)) return;
  	return a + b;
}

Number.isSafeInteger

Number.MIN_SAFE_INTEGER <= value <= Number.MAX_SAFE_INTEGER의 μœ νš¨ν•œ μ •μˆ˜κ°’μΈμ§€λ₯Ό νŒλ³„ν•©λ‹ˆλ‹€.

λ‹€λ§Œ... μ—­μ‹œ 또 λΆ€λ™μ†Œμˆ˜μ  계산에 λŒ€ν•œ ν•œκ³„κ°€ μžˆλŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€ 😭

Number.isSafeInteger(Number.MAX_SAFE_INTEGER - 0.1); // true

Number.prototype.toExponential

μ§€μˆ˜ ν‘œκΈ°λ²•μ— 맞좘 κ²°κ³Ό 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
인수둜, λͺ‡ 번째 μ†Œμˆ˜μ κΉŒμ§€ ν‘œκΈ°ν•  것인지λ₯Ό μ •ν•©λ‹ˆλ‹€.

μ΄λ•Œ, μ£Όμ˜ν•  점은 래퍼 κ°μ²΄λ‘œμ„œμ˜ Number을 ν™œμš©ν•  κ²½μš°μ—, 숫자 νƒ€μž…μ˜ 값이 μ •μˆ˜ νƒ€μž…μ΄λΌλ©΄, λ’€μ˜ .을 μ†Œμˆ˜μ μœΌλ‘œ ν•΄μ„ν•˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

ν•΄κ²°λ°©λ²•μœΌλ‘œλŠ” 숫자 뒀에 곡백(' ')을 μž…λ ₯ν•˜κ±°λ‚˜ ()으둜 숫자λ₯Ό 감싸주면 λ©λ‹ˆλ‹€.

console.log(21312.toExponential(6)) // Uncaught SyntaxError: Invalid or unexpected token
console.log((21312).toExponential(6)) // 2.131200e+4
console.log(21312.12324765.toExponential(6)) // 2.131212e+4

Number.prototype.toFixed

이 μ—­μ‹œ λΆ€λ™μ†Œμˆ˜μ μ„ μ œλŒ€λ‘œ ν•΄μ„ν•˜μ§€ λͺ»ν•˜λŠ” 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€...!

console.log((1.255).toFixed(2)) // 1.25 (1.26이 κΈ°λŒ“κ°’)

Number.prototype.toPrecision

전체 μžλ¦Ώμˆ˜κΉŒμ§€ μœ νš¨ν•˜λ„λ‘ λ‚˜λ¨Έμ§€ 자릿수λ₯Ό λ°˜μ˜¬λ¦Όν•©λ‹ˆλ‹€.
λ§Œμ•½ ν‘œν˜„ν•  수 μ—†λ‹€λ©΄ μ§€μˆ˜ ν‘œκΈ°λ²•μœΌλ‘œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
μ΄λ•Œ, 인수인 전체 자릿수λ₯Ό μƒλž΅ν•˜λ©΄ κΈ°λ³Έκ°’μœΌλ‘œ 0이 μ „λ‹¬λ©λ‹ˆλ‹€.

(12345.6789).toPrecision(); // "12345.6789"
(12345.6789).toPrecision(1); // "1e+4"
(12345.6789).toPrecision(3); // "1.23e+4"
(12345.6789).toPrecision(5); // "12346"
(12345.6789).toPrecision(6); // "12345.7"

Number.prototype.toString

말 κ·ΈλŒ€λ‘œ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
"" + [λ¬Έμžκ°’]κ³Ό λ™μΌν•œ κ²°κ³Όλ₯Ό λ‚³μŠ΅λ‹ˆλ‹€.

(10).toString(); // "10"
(Infinity).toString(); // "Infinity"
(NaN).toString(); // "NaN"

πŸŽ‰ 마치며

생각보닀 λ‹Ήν™©μŠ€λŸ¬μ› μ„ 것 κ°™μ•„μš”.

μ™œ μ΄λ ‡κ²Œ μ•ˆ λ˜λŠ” 게 λ§Žμ•„...?

κ·Έλž˜μ„œ 사싀 이 νŒŒνŠΈμ—μ„œ κΌ­ μ•Œκ³  λ„˜μ–΄κ°€μ•Ό ν•  게 μžˆμŠ΅λ‹ˆλ‹€.
λ°”λ‘œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ‚°μˆ  μ—°μ‚°μ—λŠ” 항상 뢀동 μ†Œμˆ˜μ μ΄ λ°©ν•΄ν•œλ‹€λŠ” μ‚¬μ‹€μž…λ‹ˆλ‹€.

λ”°λΌμ„œ λ§Œμ•½ μ›ν•˜λŠ” κ²°κ³Όκ°€ μ œλŒ€λ‘œ λ‚˜μ˜€μ§€ μ•ŠλŠ”λ‹€λ©΄, μ„€λ§ˆ...?λΌλŠ” μ˜μ‹¬μ„ κΌ­ ν•΄μ•Ό ν•΄μš”.

κ·Έ μ„€λ§ˆκ°€... 정말 λͺ‡ μ‹œκ°„μ„ 살릴 수 μžˆλ‹΅λ‹ˆλ‹€. 😭

그럼, λ‹€λ“€ 즐거운 κ³΅λΆ€ν•˜μ‹œκΈΈ λ°”λΌμš”. 이상!

profile
People are scared of falling to the bottom but born from there. What they've lost is nth. πŸ˜‰
post-custom-banner

0개의 λŒ“κΈ€