숫자가 정확성을 잃지 않고 도달할 수 있는 JavaScript의 최대 정수 값은 얼마입니까?

이것은 언어로 정의됩니까?정의된 최대값이 있습니까?브라우저마다 다른가요?



질문에 대한 답변



JavaScript에는 및 두 가지 번호 유형이 있습니다.

가장 많이 사용되는 숫자 유형은Number는 64비트 부동소수점 IEEE 754 번호입니다.

이 유형의 정확한 최대 적분값은 다음과 같습니다.

  • 2-153 또는
  • +/- 9,007,199,254,740,991 또는
  • 9조 7천 9백 9십억 2천 5백 4십만 7천 9백 1

대략적으로 말하면, 1,000조 바이트는 페타바이트(또는 1,000 테라바이트)입니다.

이 문맥에서 “안전”은 정수를 정확하게 표현하고 그것들을 정확하게 비교할 수 있는 능력을 의미한다.

사양부터:

크기가 2를53 넘지 않는 모든 양의 정수 및 음의 정수는 다음과 같이 표시됩니다.Numbertype (실제로 정수0에는 +0과 -0의 2개의 표현이 있습니다)

이 값보다 큰 정수를 안전하게 사용하려면 상한이 없는 를 사용해야 합니다.

비트 연산자와 시프트 연산자는 32비트 정수로 동작하므로 이 경우 최대 안전 정수는 2-131(2147,483,647)입니다.

const log = console.log var x = 9007199254740992 var y = -x log(x == x + 1) // true ! log(y == y - 1) // also true !
// Arithmetic operators work, but bitwise/shifts only operate on int32: log(x / 2)
// 4503599627370496 log(x >> 1)
// 0 log(x
1)
// 1


번호 9,007,199,254,740,992에 관한 기술 노트:이 값은 IEEE-754에 의해 정확하게 표현되며 변수에서 이 값을 할당하고 읽을 수 있습니다.따라서 이 값 이하의 정수로 이루어진 도메인에서 매우 신중하게 선택된 어플리케이션에서는 이 값을 최대값으로 취급할 수 있습니다.

일반적으로 이 IEEE-754 값은 논리값 9,007,199,254,740,992 또는 9,007,199,254,740,993 중 어느 쪽을 부호화하고 있는지 애매하기 때문에 부정확하게 취급해야 합니다.




>= ES6:

Number.MIN_SAFE_INTEGER; Number.MAX_SAFE_INTEGER; 

<= ES5

참고 자료:

Number.MAX_VALUE; Number.MIN_VALUE; 

console.log('MIN_VALUE', Number.MIN_VALUE); console.log('MAX_VALUE', Number.MAX_VALUE);
console.log('MIN_SAFE_INTEGER', Number.MIN_SAFE_INTEGER); //ES6 console.log('MAX_SAFE_INTEGER', Number.MAX_SAFE_INTEGER); //ES6




253 == 9 007 199 254 740 992 입니다.그 이유는Number는 52비트 가수에 부동소수로 저장됩니다.

최소값은 -253 입니다.

이것은 몇 가지 재미있는 일들이 일어나게 한다.

Math.pow(2, 53) == Math.pow(2, 53) + 1 >> true 

또한 위험할 수도 있습니다. 🙂

var MAX_INT = Math.pow(2, 53); // 9 007 199 254 740 992 for (var i = MAX_INT; i < MAX_INT + 2; ++i) {
// infinite loop } 

자세한 것은, http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html 를 참조해 주세요.




JavaScript에는 다음과 같은 숫자가 있습니다.Infinity.

예:

(Infinity>100) => true
// Also worth noting Infinity - 1 == Infinity => true
Math.pow(2,1024) === Infinity => true 

이 토픽에 관한 몇 가지 질문에는 이것으로 충분할 수 있습니다.




Jimmy의 답변은 연속된 JavaScript 정수 스펙트럼을 -9007199254740992 ~9007199254740992로 올바르게 나타내고 있습니다(죄송합니다만, 9007199254740993이라고 생각하실 수 있습니다만, 틀렸습니다).아래 또는 아래 jsfiddle 데모).

console.log(9007199254740993);

그러나 이를 프로그램적으로 발견/증명할 수 있는 답변은 Cool 이외에는 없습니다.AJ86은 답변에서 28.56년 후에 종료될 것임을 시사했습니다. 따라서 테스트 바이올린과 함께 약간 더 효율적인 방법(정확히 말하면 약 28.5599999968312년)을 제시합니다.

/**
* Checks if adding/subtracting one to/from a number yields the correct result.
*
* @param number The number to test
* @return true if you can add/subtract 1, false otherwise.
*/ var canAddSubtractOneFromNumber = function(number) {
var numMinusOne = number - 1;
var numPlusOne = number + 1;
return ((number - numMinusOne) === 1) && ((number - numPlusOne) === -1); }
//Find the highest number var highestNumber = 3; //Start with an integer 1 or higher
//Get a number higher than the valid integer range while (canAddSubtractOneFromNumber(highestNumber)) {
highestNumber *= 2; }
//Find the lowest number you can't add/subtract 1 from var numToSubtract = highestNumber / 4; while (numToSubtract >= 1) {
while (!canAddSubtractOneFromNumber(highestNumber - numToSubtract)) {
highestNumber = highestNumber - numToSubtract;
}
numToSubtract /= 2; }
//And there was much rejoicing.
Yay.
console.log('HighestNumber = ' + highestNumber);