Посмотрите этот код:

<html>
  <head> 
    <script src="http://www.json.org/json2.js" type="text/javascript"></script>
    <script type="text/javascript">

      var jsonString = '{"id":714341252076979033,"type":"FUZZY"}';
      var jsonParsed = JSON.parse(jsonString);
      console.log(jsonString, jsonParsed);

    </script>
  </head>
  <body>
  </body>
</html>

Когда я вижу свою консоль в Firefox 3.5, значение jsonParsed равно:

Object id=714341252076979100 type=FUZZY

Т.е. число округляется. Пробовал разные значения, одинаковый результат (число округлено).

У меня также нет правил округления. 714341252076979136 округляется до 714341252076979200, тогда как 714341252076979135 округляется до 714341252076979100.

Мы только что выпустили Цель той же политики происхождения — защитить вас от вредоносного JavaScript на siteA.com, который получает доступ к частной информации, которую вы выбрали для обмена только с siteB.com. Без такой же политики происхождения JavaScript, написанный авторами siteA.com, может заставить ваш браузер отправлять запросы на siteB.com, используя ваши файлы cookie для аутентификации для siteB.com. Таким образом, siteA.com может украсть секретную информацию, которой вы делитесь с siteB.com.

Я добавил

То, что вы видите здесь, на самом деле является эффектом двух округлений. Числа в ECMAScript являются внутренне представленными с плавающей точкой двойной точности. Когда id установлен в 714341252076979033 (0x9e9d9958274c359 в шестнадцатеричном виде), ему фактически присваивается ближайшее представимое значение двойной точности, которое является 714341252076979072 (0x9e9d9958274c380). Когда вы распечатываете значение, оно округляется до 15 значащих десятичных цифр, что дает 14341252076979100 Глядя на вывод

Вы переполняете емкость числового типа JavaScript, см. §8.5 спецификации для подробностей. Эти идентификаторы должны быть строками.

IEEE-754 double- точность с плавающей точкой (вид числа, используемого JavaScript) не может точно представлять все числа (конечно). Известно, что 0.1 0.2 == 0.3 ложно. Это может влиять на целые числа так же, как и на дробные числа ;, которые начинаются, когда вы превышаете 9 007 199 254 740 991 (Number.MAX_SAFE_INTEGER).

Beyond Number.MAX_SAFE_INTEGER 1 (9007199254740992), формат с плавающей точкой IEEE-754 больше не может представлять каждое последовательное целое число. 9007199254740991 1, 9007199254740992, но 9007199254740992 1, также 9007199254740992 Атрибут Onkeyup: 9007199254740993 не могут быть представлены в формате. Следующее, что может быть: 9007199254740994 Мой первый шаг — всегда проверять HTML и проверять синтаксис с помощью 9007199254740995 не может быть, но 9007199254740996 может.

, причина в том, что у нас закончились биты, поэтому у нас больше нет бита 1 с ; самого младшего бита представляет кратные 2. В конечном итоге, если мы продолжим работу, мы потеряем этот бит и будем работать только с кратными 4. И так далее.

Ваши значения значительно выше этого порога, поэтому они округляются до ближайшего представимого значения.


Если вам интересно узнать о битах, вот что происходит: двоичное число IEEE-754 с двойной точностью с плавающей запятой имеет знаковый бит, 11 битов показателя степени (который определяет общую шкалу числа как степень из 2 [потому что это двоичный формат]), и 52 бита значимости (но формат настолько умный, что из этих 52 бит получается 53 бита точности). Способ использования показателя степени сложен ( описано здесь ), но в очень неопределенных терминах, если мы добавим единицу к показателю степени, значение значимое удваивается, поскольку показатель степени используется для степеней 2 (опять же, будьте осторожны, это не прямое, там есть хитрость).

Итак, давайте посмотрим на значение 9007199254740991 (иначе, Number.MAX_SAFE_INTEGER):

    −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− sign bit
  /  −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− exponent
 / /        |   −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− − significand
/ /         | /                                                  |
0 10000110011 1111111111111111111111111111111111111111111111111111
                = 9007199254740991 (Number.MAX_SAFE_INTEGER)

Это значение показателя степени, 10000110011 Internet Explorer 6

Но теперь это значение и заполнено. Чтобы пройти это число, мы должны увеличить показатель степени, что означает, что если мы добавим единицу к значениюand, значение представленного числа возрастет на 2, а не на 1 (поскольку показатель степени применяется к 2, основание этого двоичное число с плавающей запятой):

    −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− sign bit
  /  −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− exponent
 / /        |   −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− − significand
/ /         | /                                                  |
0 10000110100 0000000000000000000000000000000000000000000000000000
                = 9007199254740992 (Number.MAX_SAFE_INTEGER   1)

Ну, все в порядке, потому что 9007199254740991 1, 9007199254740992 в любом случае. Но! Мы не можем представлять 9007199254740993. У нас закончились биты. Если мы добавляем только 1 к значениюand, это добавляет 2 к значению:

    −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− sign bit
  /  −−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− exponent
 / /        |   −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− − significand
/ /         | /                                                  |
0 10000110100 0000000000000000000000000000000000000000000000000001
                = 9007199254740994 (Number.MAX_SAFE_INTEGER   3)

Формат просто не может больше представлять нечетные числа, так как мы увеличиваем значение, показатель степени слишком велик.

string:

JavaScript использует значения с плавающей запятой двойной точности, то есть общую точность 53 бита, но вам нужно

ceil(lb 714341252076979033) = 60

Эта функция называется

Ближайшее точно представимое число: { *} Вместо этого числа вы получите 714341252076979072 Несколько методов без jQuery: 0. Первым аргументом этого метода является массив для обновления, мы пропускаем пустой объект, потому что хотим получить новый объект. 1).

вместо этого числа, потому что 714341252076979100, как описано в ECMA-262, §9.8.1, работает со степенями десяти, и с точностью до 53 бит все эти числа равны. ToString() Можете ли вы отправить номер в виде строки? Разделить на две части?

Проблема в том, что ваше число требует большей точности, чем JavaScript ,

JavaScript может обрабатывать только точные целые числа примерно до 9000 миллионов (это 9 с 15 нулями). Выше, и вы получите мусор. Обойти это, используя строки для хранения чисел. Если вам нужно выполнить математику с этими числами, напишите свои собственные функции или посмотрите, сможете ли вы найти для них библиотеку: я предлагаю первую, поскольку мне не нравятся библиотеки, которые я видел. Для начала ознакомьтесь с двумя моими функциями в

. Я видел эту ветку, но я не видел конкретного примера JavaScript. Есть ли простая строка. Доступно в JavaScript или это просто случай проверки & Quot ; & Quot ;? Начните с Firebug и IE Debugger. Глядя на вывод