JS 숫자의 비밀

반올림 오류



Javascript가 어떻게 작동하는지 모르는 경우 Javascript에서 흥미로운 일이 발생할 수 있습니다. 예를 들어 부동 소수점 숫자는 반올림 오류를 일으킵니다. 0.1과 0.2는 정확하게 표현할 수 없습니다. 따라서 0.1 + 0.2 === 0.3은 거짓이 됩니다.

왜 그런 일이 일어나고 있습니까? Javascript는 32비트 부동 소수점 숫자 시스템을 사용합니다. 많은 소수를 이진법으로 표현하려면 무한한 자릿수가 필요합니다. 0.1(1/10)을 계산하려고 하면 소수점이 무한정 나옵니다. 0.1 + 0.2 의 결과는 0.30000000000000004 이며 0.3 와 같지 않습니다.

번호.EPSILON


Number.EPSILON는 표현 가능한 두 숫자 사이의 가장 작은 간격을 반환합니다. 이는 부동 소수점 근사 문제에 유용합니다.

function numberEquals(x: number, y: number) {
    return Math.abs(x - y) < Number.EPSILON;
}

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

0.1 + 0.20.3 의 차이는 Number.EPSILON 보다 작습니다.

더블 도트



숫자는 소수점이 고정된 문자열로 변환될 수 있습니다. 정수에 대해 toFixed() 함수를 직접 호출하려면 5..toFixed(1) === '5.0' 와 같이 이중 점 표기법을 사용해야 합니다. 왜 해야 합니까? 첫 번째 점 표기법은 부동 소수점 숫자를 나타내기 위한 것입니다. 0.77.toFixed(1) === '0.7'이전 예에서 toFixed() 함수를 사용하여 같음(0.1 + 0.2).toFixed(1) === 0.3.toFixed(1)을 일치시킬 수 있습니다.

참고: Javascript의 프리미티브는 객체가 아니지만 "string".length , 0.77.toFixed(1) 를 사용할 수 있는 이유는 무엇입니까? 음, Javascript는 메서드를 호출할 때 프리미티브에 대한 값으로 특수 래퍼 객체를 생성하고 실행 후 삭제합니다.

최소, 최대


Number에는 최대 및 최소 정수와 부동 소수점 숫자를 나타내는 흥미로운 상수가 포함되어 있습니다. Javascript에는 Infinity-Infinity 가 있지만 실제 숫자가 아닙니다.
Number.MAX_SAFE_INTEGER는 가장 큰 정수를 반환합니다. 그것은 9007199254740991와 같습니다. 그리고 이 표현은 참입니다:

Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true

Number.MAX_VALUE는 가장 큰 부동 소수점 숫자를 반환합니다. 1.7976931348623157e+308 와 같습니다. 동일한 표현:

Number.MAX_VALUE + 1.111 === Number.MAX_VALUE + 2.022; // true


최소값은 Number.MIN_VALUE5e-324와 동일한 Number.MIN_SAFE_INTEGER와 같은 가장 작은 부동 소수점 숫자로 -9007199254740991로 표시됩니다.Number.MIN_VALUE도 0에 가장 가까운 부동 소수점입니다.

Number.MIN_VALUE - 1 === -1; // true


왜 사실입니까? 이 표현은 0 - 1 === -1와 유사하기 때문에

요약



Javascript 숫자의 크기를 요약해 보겠습니다.

-Infinity < Number.MIN_SAFE_INTEGER < Number.MIN_VALUE < 0 < Number.MAX_SAFE_INTEGER < Number.MAX_VALUE < Infinity


부동 소수점 숫자로 작업할 때 일부 숫자는 정확하게 표현할 수 없기 때문에 반올림 오류를 고려해야 합니다. 타사 라이브러리를 사용하거나 Number.EPSILON 로 숫자 간의 차이를 확인할 수 있습니다.

사진 제공: Volkan Olmez on Unsplash

좋은 웹페이지 즐겨찾기