๐ JavaScript์์ 0.1 + 0.2๋ 0.3์ผ๊น?
0.1 + 0.2 === 0.3; // false
typeof(0.1); // 'number'
const a = 0.1;
const b = 0.2;
a + b === 0.3 // false
console.log(a + b); // 0.30000000000000004
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด 0.3์ด ์๋๋๋ค.
์ปดํจํฐ๋ ๋ช
๋ น์ ์ฒ๋ฆฌํ๊ธฐ ์ํด 10์ง๋ฒ์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒ์ ์์ ์ ์ธ์ด์ธ 2์ง๋ฒ์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
์์ ๊ฐ์ ๊ฒฐ๊ณผ๋ JavaScript๊ฐ ์ค์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๋ถ๋์์์ ๋ฐฉ์ ์ ์ฑํํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๊ฐ๋จํ๊ฒ ์ง๊ณ ๋์ด๊ฐ์๋ฉด...(๋งค๋ฒ ๊น๋จน์ผ๋ฏ๋ก..)
- ์ ์ : 10, 400 ํน์ -5 ๊ฐ์ ๋ชจ๋ ์ซ์
- ์ค์ : -1, 0, 1/2, e, π ์ฃผ๋ก ์ค์ง์ ์์ ์ ๋๋ ์ญ์ง๋ฒ ์ ๊ฐ๋ก ํํ๋๋ ์ ์ฒด๊ณ
- ๋ถ๋์์์ ์ค์ (Floating point numbers(floats)) : 12.5, 6.7876 ๊ฐ์ด ์์์ ๊ณผ ์์ ์๋ฆฟ์๊ฐ ์๋ ๊ฒ
- ๋ฐฐ์ ๋ฐ๋ ๋ถ๋์์์ ์ค์(Double) : IEEE 754 ํ์ค ๋ถ๋์์์ ๋ณด๋ค ๋ ์ ํํ ์ ๋ฐ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ํน๋ณํ ๋ฐ์ดํฐ ํ์
(Doubles๋ Floats ๋ณด๋ค ๋ ๋ง์ ์์ ์๋ฆฟ์๋ฅผ ํํํ ์ ์์ด์ ์์์ ํํ์๋ Doubles๊ฐ ๋ ์ ํํจ) - 2์ง์ : 10์ง์๋ฅผ 0๊ณผ 1์ ์ด์ฉํด ๋ํ๋ด๋ ๋ฐ์ดํฐ ํ์
- 8์ง์ : 10์ง์๋ฅผ 0๋ถํฐ 7๊น์ง์ ์๋ฅผ ์ด์ฉํด ๋ํ๋ด๋ ๋ฐ์ดํฐ ํ์
- 16์ง์ : 10์ง์๋ฅผ 0๋ถํฐ 15๊น์ง์ ์๋ฅผ ์ด์ฉํด ๋ํ๋ด๋ ๋ฐ์ดํฐ ํ์
(1
F CSS ์์ ์ง์ ํ ๋..)
10, A
๊ณ์ ๋์ค๊ณ ์๋ ๋ถ๋์์์ ์ด๋ผ๋ ๊ฒ ๋์ฒด ๋ฌด์์ธ์ง๋ ๋ฐ์์ ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. ์ง๊ธ์ ๊ฐ๋จํ๊ฒ ์ปดํจํฐ๊ฐ ์ค์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ๋๋ผ๊ณ ๋ง ์์๋๋ฉด ๋๊ฒ ์ต๋๋ค.
๐ $ 1\over 3$ + $1\over 3$ + $1\over 3$ ์ ๋ฌด์์ผ๊น์?
์ผ๋ฐ์ ์ผ๋ก 1์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ฒ ์ง๋ง ์ด์ง๋ฒ์ ์ฌ์ฉํ๋ ์ปดํจํฐ๋ ๊ทธ๋ ์ง๊ฐ ์์ต๋๋ค.
$ 1\over 3$ = 0.3333333333.... ๋ฌดํ๋๊น์ง 0.33333์ด ๋ฐ๋ณต๋ฉ๋๋ค.
0.3์ 2์ง์๋ก ๋ฐ๊พธ๋ฉด : 0.010011001100110011001100110011001100110011001100110011...
0.2๋ฅผ 2์ง์๋ก ๋ฐ๊พธ๋ฉด : 0.001100110011001100110011001100110011001100110011001101...
์ด๋ ๋ฏ์ด 2์ง์๋ก ํํํ์ง ๋ชปํ๋ ์์๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ปดํจํฐ์๋ ์ ํ๋ ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ผ๋ฏ๋ก ๋ฌดํํ ์์ ์ซ์๋ฅผ ์ ์งํ ์ ์์ผ๋ฏ๋ก ๊ทผ์ฌ์น์ ๊ฐ์ด ์ ์ฅ๋๊ฒ ๋ฉ๋๋ค. ์ด ์์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์ ์ค ํ๋๊ฐ ๋ถ๋์์์ ๋ฐฉ์ ์
๋๋ค.
๊ทผ์ฟ๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์๋ ๊ณ ์ ์์์ ๋ฐฉ์๊ณผ ๋ถ๋์์์ ๋ฐฉ์์ด ์์ต๋๋ค.
๐ IEEE-754 : JavaScript๊ฐ ์ซ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์
๋ฒ์จ๋ถํฐ ๋จธ๋ฆฌ๊ฐ ์ํ๊ธฐ ์์ํ์ง๋ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ ์ซ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
JavaScript ์ซ์๋ ํญ์ 64๋นํธ ๋ถ๋ ์์์ ์ด๋ค.
JavaScript๋ ๋ค๋ฅธ ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฌ๋ฆฌ ์ ์, short, long, ๋ถ๋์์์ ๊ฐ์ ๋ค์ํ ์ ํ์ ์ซ์๋ฅผ ์ ์ํ์ง ์์ต๋๋ค.
JavaScript์ ์ซ์๋ Java, C#์ double ํ์
์ฒ๋ผ IEEE-754 ํ์ค์ ๋ฐ๋ผ ํญ์ international IEEE 754 standard๋ก ์ง์ ๋ฉ๋๋ค.
- Number๋ ์์์ ์ดํ 17์๋ฆฌ ์ ๋๋ง ์ ์งํ๋ฉฐ ์ฐ์ ์ ๋ฐ์ฌ๋ฆผ์ ๋์์ด ๋ฉ๋๋ค.
- Number๊ฐ ๊ฐ์ง ์ ์๋ ๊ฐ์ฅ ํฐ ๊ฐ์ 1.8E308 ๊ทธ๋ณด๋ค ๋ ํฐ ๊ฐ์ ํน๋ณํ Number ์์์ธ Infinity๋ก ๋์ฒด๋ฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ค์์ ์ ์ ๋ชจ๋ Number๋ผ๋ ํ๋์ ๋ฐ์ดํฐ ํ์ ๋ง ์ฌ์ฉํฉ๋๋ค. (์ค์์ ์ ์ ๋ชจ๋ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ํ๋์ ๋ฐฉ๋ฒ์ผ๋ก ๋์ํ๊ฒ ํ ์ ์๋ค๋ ๋ป)
0.1 + 0.2 === 0.3; // false
typeof(0.1); // 'number'
const a = 0.1;
const b = 0.2;
a + b === 0.3 // false
console.log(a + b); // 0.30000000000000004
๋ค์ ๋ณธ๋ก ์ผ๋ก ๋ค์ด์์ 0.1 + 0.2๋ฅผ ๋ค์ ์
๋ ฅํด ๋ณด๋ฉด 0.30000000000000004
๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค.
์ ์์ Number๋ ์์์ ์ดํ 17์๋ฆฌ ์ ๋๋ง ์ ์งํ๋ค๊ณ ๋์ด์๋๋ฐ ์ 30000000000000004
์ ๊ฐ์๊ฐ 17๊ฐ์ธ ๊ฑธ ์ ์ ์๊ฒ ์ฃ . (์ธ์ด๋ดค๋๋ฐ 17๊ฐ๊ฐ ๋ง๋ค์๐)
ํ์ด์ฌ์ ์๋ก ๋ค๋ฉด ํ์ด์ฌ์ ์๋ฃํ์๋ ์ ์(int)์ ์ค์(float)๊ฐ ์์ต๋๋ค. ํ์ด์ฌ์ ์ค์ ํ์
์ float์
๋๋ค.
์๋ฐ์์๋ ์ ์์ ์ค์๊ฐ ์๊ณ ์ค์ ํ์
์๋ float, double๊ฐ ์์ต๋๋ค. float๋ 32๋นํธ๋ฅผ ๊ฐ์ง๊ณ ์ค์๋ฅผ ํํํ๊ณ double์ 64๋นํธ์
๋๋ค.
ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ซ์๋ฅผ ์ ์ํ์ง ์์ต๋๋ค.
์ฆ JS์์ 37๊ณผ ๊ฐ์ ์ซ์ ๋ฆฌํฐ๋ด์ ์ ์๊ฐ ์๋๋ผ ๋ถ๋ ์์์ ๊ฐ์ ๋๋ค. (์ด์ ๋ BigInt ํ์ ์ด ์์ง๋ง Number๋ฅผ ๋์ฒดํ๋๋ก ์ค๊ณ๋์ง ์์๋ค๊ณ ํ๋ค์.)
https://0.30000000000000004.com/ ์ด๋ฌํ ์ฌ์ดํธ๋ ์๋ค์ฉ.
์ฌ๊ธฐ์ ๋ฐฐ์ธ ์ ์๋ ๊ตํ์
์์์ ์ ์ฒ๋ฆฌํ ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด ์ฐจ์ด๊ฐ ๋๋ฌด ์์ ๋ฌด์ํ ์ ์์ง๋ง ์ค์ ์ฐ์ฐ์ด ๋ฌด์กฐ๊ฑด ์ ํํ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ์ ์ผ๋์ ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๊ฒ ์ฃ .
์ ํํ ์์์ ์ฐ์ฐ์ด ํ์ํ ๋๋ ๋ค๋ฅธ ๋ฐฉ์์ ๊ณ ๋ คํด์ผ ํ๊ฒ ์ฃ . ์๋ฅผ ๋ค๋ฉด ๊ธ์ฉ ์ชฝ์ ์ผ์ ์ฒ๋ฆฌํ๋๋๊ฐ.... ๊ทธ๋ฐ.. ์ผ์ด ์๋ค๋ฉด.. ์ด๋ป๊ฒ ํด์ผ ํ ์ง๋ ๊ทธ๋ ๊ฐ์ ๋ค์ ๊ณต๋ถ๋ฅผ...
๋ฐ์์๋ ์ค์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ธ ๊ณ ์ ์์์ , ๋ถ๋์์์ ์ ๋ํด์ ์กฐ๊ธ๋ง.. ์์๋ณด๊ฒ ์ต๋๋ค.
๐ ๊ณ ์ ์์์ fixed point
์์์ ์ ์ฌ์ฉํ์ฌ ๊ณ ์ ๋ ์๋ฆฟ์์ ์์๋ฅผ ๋ํ๋ด๋ ๊ฒ.
์ค์๋ ๋ณดํต ์ ์๋ถ์ ์์๋ถ๋ก ๋๋ ์ ์์ต๋๋ค. ์ค์๋ฅผ ํํํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ์์ ์์๋ถ์ ์๋ฆฟ์๋ฅผ ๋ฏธ๋ฆฌ ์ ํ์ฌ, ๊ณ ์ ๋ ์๋ฆฟ์์ ์์๋ฅผ ํํํ๋ ๊ฒ
์ด ๋ฐฉ์์ ์ ์๋ถ์ ์์๋ถ์ ์๋ฆฟ์๊ฐ ํฌ์ง ์์ผ๋ฏ๋ก, ํํํ ์ ์๋ ๋ฒ์๊ฐ ๋งค์ฐ ์ ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. (ํ์ ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ถ๋์์์ ๋ฐฉ์๋ณด๋ค ์ข์ ๋ฒ์์ ์๋ง ๋ํ๋ผ ์ ์์ต๋๋ค.)
๐ ๋ถ๋์์์ floating point ๆตฎๅๅฐๆธ้ป
๋ฐ ๋ถ
์์ง์ผ ๋
ํ๋์ ์ค์๋ฅผ ๊ฐ์๋ถ์ ์ง์๋ถ๋ก ๋๋์ด ํํํ๋ ๋ฐฉ์.
์ค์๋ฅผ ์ปดํจํฐ์์์ ๊ทผ์ฌํ์ฌ ํํํ ๋ ์์์ ์ ์์น๋ฅผ ๊ณ ์ ํ์ง ์๊ณ ๊ทธ ์์น๋ฅผ ๋ํ๋ด๋ ์๋ฅผ ๋ฐ๋ก ์ ๋ ๊ฒ. (๋ ๋์ด ์์์ ๋ฐฉ์์ด๋ผ๊ณ ๋ ํฉ๋๋ค.)
IEEE์ ๋ถ๋์์์ ๋ฐฉ์
IEEE 754๋ ์ ๊ธฐ ์ ์ ๊ธฐ์ ์ ํํ (IEEE)์์ ๊ฐ๋ฐํ ์ปดํจํฐ์์ ๋ถ๋์์์ ์ ํํํ๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ํ์ค์ด๋ค.
IEEE 754์ ๋ถ๋ ์์์ ํํ์ ํฌ๊ฒ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋๋ฐ, ์ต์์ ๋นํธ๋ ๋ถํธ๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ง์ ๋ถ๋ถ(exponent)๊ณผ ๊ฐ์ ๋ถ๋ถ(fraction/mantissa)์ด ์์ต๋๋ค.
( ๋งจ ์์๋ฆฌ๋ ๋ถํธ๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋๋ฐ 1์ด๋ฉด ์์ 0์ด๋ฉด ์์์ ๋๋ค.)
- ์ ํ๋ ๋ฌธ์
- ๋ถ๋ ์์์ ์ผ๋ก ํํํ ์๊ฐ ์ค์๋ฅผ ์ ํํ ํํํ์ง ๋ชปํ๊ณ ๋ถ๋ ์์์ ์ฐ์ฐ ์ญ์ ์ค์ ์ณ๊ฐ์ ์ฐ์ฐ์ ์ ํํ ํํํ์ง ๋ชปํ๋ ๊ฒ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค.
- ๊ท๊ฒฉ
- ์ค์ ์ฌ์ฉ๋๊ณ ์๋ ๋ถ๋ ์์์ ๋ฐฉ์์ ๋๋ถ๋ถ IEEE 754 ํ์ค์ ๋ฐ๋ฆ ๋๋ค.
๐ ๋ถ๋์์์ ๋ฐฉ์์ ์ค์ฐจ
๋ถ๋ ์์์ ๋ฐฉ์์ผ๋ก ํํํ๋ ์ค์๋ ํญ์ ์ค์ฐจ๊ฐ ์กด์ฌํ๋ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ปดํจํฐ์์ ์ค์๋ฅผ ํํํ ๋๋ ์ ํํ ํํ์ด ์๋ ๊ทผ์ฌ์น๋ฅผ ํํํ๊ฒ ๋ฉ๋๋ค.
์ฐธ์กฐ ๋ฐ ์ถ์ฒ
'Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] promise, async, await ์ฐ์ง ์๊ณ parallel, waterfall ๊ตฌํํ๊ธฐ (0) | 2022.06.03 |
---|---|
[JS] Promise, Await ๋น๋๊ธฐ์ ๋ํด ์์๋ณด๊ธฐ (0) | 2022.06.01 |
[JS] JavaScript์ ํ์ ๊ฒ์ฌ (0) | 2022.05.29 |
[JS] ์์๋ณ์๋ฅผ ์ค์ฌ์ผ ํ๋ ์ด์ (ํด๋ฆฐ ์ฝ๋) (0) | 2022.05.27 |
[JS] ์ด๋ฒคํธ ์์ (0) | 2022.05.14 |