Number - 64비트 부동소수점

2023. 3. 28. 14:02Javascript/TCP school

다음과 같이 동일하게 정리하였다.

아래의 주석을 확인하길 바란다.

<!DOCTYPE html>
<html>
<head>
    <title>Document</title>
</head>
<body>
    <script>
        let x = 0.1 + 0.2;
        console.log(x); // 0.30000000000000004

        // 64 비트 부동 소수점
        console.log(1/2); // 0.5
        console.log(2/3); // 0.6666666666666666


        console.log(1/10); // 0.1
        console.log((0.1).toString()); // 0.1
        console.log((0.1).toString(2)); // 0.0001100110011001100110011001100110011001100110011001101

        // 64 비트를 넘어가는 경우가 있다 >> 그럼 저장이 안되는 경우도 있다는 것
        // 52비트가 넘어가는 경우 반올림이 되어, 같은 값이 되지 못한다
        // 그래서 이를 잘 고려해서 다른 방법들을 쓰던지 해야한다!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        // 1비트 - 양수 0, 음수 1
        // 11비트 - 지수부 - 2^(n-1) - 1 + m, (n은 ~ 비트(11), m은 1이 되기위해 얼마나 옮겼는가(4) - 오른쪽은 + 왼쪽은 -))
        // 52비트 - 가수부

        // 11비트일 경우 
        // 2^(n-1) - 1 + m
        // n = 11, m = 4
        // 2^(11-1) - 1 + 4 = 1019
        console.log((1019).toString(2)); // 1111111011 >> 지수부에서 11자리라 하였기 때문에 지금은 10자리기에 0을 붙여서 생각하면 됨 01111111011

        // 양수였으니까 0을 맨 처음에 넣으면 됨
        // 지수부는 01111111011 넣어주고
        // 13부터 넣으면 되는데 0.0001100110011001100110011001100110011001100110011001101 니까
        // 0.0001는 사용했으니까

        console.log((0.1).toString(2)); // 0.0001100110011001100110011001100110011001100110011001101
        console.log((1019).toString(2)); // 1111111011

        console.log((0.2).toString(2)); // 0.001100110011001100110011001100110011001100110011001101
        // 1비트 - 0
        // 11비트 - 2^(11-1) - 1 - 3 = 1020
        console.log((1020).toString(2)); // 1111111100 >> 10개라서 11개로 0 추가 >> 01111111100

        console.log("0.1",(0.1).toString(2));
        console.log("0.2",(0.2).toString(2));
        // 0.2 : 0.001100110011001100110011001100110011001100110011001101
        // 0.1 : 0.0001100110011001100110011001100110011001100110011001101
        //                                                    ......100111    >> plused라고 지칭하자
        // 위 처럼 뒤에서부터 다 더하면 된다
        // 이를 다시 parseInt로 바꿔보면 오차가 나타나게 된다.
        // console.log(parseInt('........100111').Math.pow(2,-55)); // 0.3000000000000~4 라고 나오게 된다


        // 아래의 라이브러리를 사용하면된다!
        // BigNumber.js
        // Big.js
        // Decimal.js

        let x2 = 9999999999999999;
        //       9007199254740991 >> 이것이 최대 값인데, 이를 넘었기 때문에 아래와 같이 다른 수를 뱉어낸다.
        console.log(x2); // 10000000000000000 전혀 다른 값을 출력해 낸다.
        console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
    </script>
</body>
</html>

'Javascript > TCP school' 카테고리의 다른 글

RegExp 객체  (0) 2023.01.20
정규 표현식의 응용  (0) 2023.01.20
Strict 모드  (0) 2023.01.19
예외 처리  (0) 2023.01.18
이벤트 리스너 호출  (0) 2023.01.18