Какое наибольшее целочисленное значение в JavaScript может быть достигнуто числом без потери точности? - PullRequest
894 голосов
/ 21 ноября 2008

Это определяется языком? Есть ли определенный максимум? Отличается ли он в разных браузерах?

Ответы [ 24 ]

7 голосов
/ 15 мая 2012

Все, что вы хотите использовать для побитовых операций, должно быть в диапазоне от 0x80000000 (-2147483648 или -2 ^ 31) до 0x7fffffff (2147483647 или 2 ^ 31 - 1).

Консоль сообщит вам, что 0x80000000 равно +2147483648, но 0x80000000 & 0x80000000 равно -2147483648.

5 голосов
/ 20 июня 2010

Попробуйте:

maxInt = -1 >>> 1

В Firefox 3.6 это 2 ^ 31 - 1.

4 голосов
/ 21 ноября 2008

Я провел простой тест с формулой X- (X + 1) = - 1, и наибольшее значение X, которое я могу получить для работы в Safari, Opera и Firefox (протестировано в OS X), равно 9e15. Вот код, который я использовал для тестирования:

javascript: alert(9e15-(9e15+1));
1 голос
/ 18 июля 2018

Давайте перейдем к источникам

Описание

Константа MAX_SAFE_INTEGER имеет значение 9007199254740991 (9 007 199 254 740 991 или ~ 9 квадриллионов). Причина этого числа заключается в том, что JavaScript использует числа с плавающей запятой с двойной точностью , как указано в IEEE 754 , и может безопасно представлять числа только от -(253 - 1) до 253 - 1.

В данном контексте под безопасностью понимается способность точно представлять целые числа и правильно их сравнивать. Например, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 будет иметь значение true, что математически неверно. См. Number.isSafeInteger () для получения дополнительной информации.

Поскольку MAX_SAFE_INTEGER является статическим свойством Number , вы всегда используете его как Number.MAX_SAFE_INTEGER, а не как свойство созданного вами объекта Number .

Совместимость браузера

enter image description here

1 голос
/ 10 января 2012

Во встроенном JavaScript Chrome Google вы можете перейти примерно к 2 ^ 1024, прежде чем число будет называться бесконечностью.

1 голос
/ 25 сентября 2014

Я пишу это так:

var max_int = 0x20000000000000;
var min_int = -0x20000000000000;
(max_int + 1) === 0x20000000000000;  //true
(max_int - 1) < 0x20000000000000;    //true

То же самое для int32

var max_int32 =  0x80000000;
var min_int32 = -0x80000000;
1 голос
/ 28 декабря 2018

На момент написания JavaScript получает новый тип данных: BigInt. Это предложение TC39 на этапе 3 . BigInt доступно в Chrome 67+, FireFox 67+ (требуется опция для его активации), Opera 54 и Node 10.4.0. Это происходит в Safari и др. Он вводит числовые литералы с суффиксом "n" и допускает произвольную точность:

var a = 123456789012345678901012345678901n;

Точность все еще будет потеряна, конечно, когда такое число (возможно, непреднамеренно) приведено к типу данных числа

0 голосов
/ 20 декабря 2018
0 голосов
/ 30 декабря 2017

В основном JavaScript не поддерживает долго.
поэтому для нормальных значений, которые он может представлять менее 32 бит, он будет использовать контейнер типа int. для целочисленных значений больше 32 бит используется двойное значение. В двойном представлении целочисленная часть составляет 53 бита, а остаток - мантисса (для хранения информации с плавающей запятой). поэтому вы можете использовать 2^53 - 1, значение которого равно 9007199254740991
вы можете получить доступ к значению для использования в вашем коде по Number.MAX_SAFE_INTEGER

0 голосов
/ 18 июня 2017

Number.MAX_VALUE представляет максимальное числовое значение, представляемое в JavaScript.

Поскольку, похоже, никто не сказал об этом, в движке v8 существует различие в поведении для числа 31 bits и числа выше этого.

Если у вас есть 32 bits, вы можете использовать первый бит, чтобы сообщить движку javascript, к какому типу относятся эти данные, а оставшиеся биты содержат фактические данные. Это то, что V8 делает в качестве небольшой оптимизации для 31 bis numbers (или раньше, мои источники довольно устарели). У вас есть последний 31 bits, являющийся числовым значением, а затем первый бит, сообщающий двигателю, является ли он числом или ссылкой на объект.

Однако, если вы используете число выше 31 bits, тогда данные не уместятся, число будет помещено в двойные 64-битные числа, и оптимизации не будет.

Нижняя строка в видео ниже:

предпочитают числовые значения, которые могут быть представлены как 31бит со знаком целые числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...