Javascript не может отобразить этот номер правильно: 3494793310847464221

У меня есть интересный вопрос: я выполнял некоторую работу с javascript, и идентификатор базы данных вышел как "3494793310847464221", теперь это вводится в javascript как число, но оно использует число как другое значение, как при выводе на предупреждение и при передаче в другую функцию javascript.

Вот пример кода, чтобы показать полную ошибку.

<html><head><script language="javascript">alert( 3494793310847464221);
var rar =  3494793310847464221;
alert(rar);
</script></head></html>

Это полностью забеспокоило меня, и на этот раз Google не мой друг...

btw число на 179 больше, чем число там...

Ответ 2

В JavaScript все числа (даже интегральные) хранятся в виде чисел с плавающей запятой IEEE-754. Однако FP имеют ограниченную "точность" (см. статью Википедии для получения дополнительной информации), поэтому ваш номер не может быть точно представлен.

Вам нужно либо сохранить свой номер в виде строки, либо использовать какой-либо другой подход "bignum" (к сожалению, я не знаю каких-либо библиотек JS bignum с верхней части моей головы).

Изменить:. После небольшого копания, похоже, что большая часть работы, выполняемой библиотеками JavaScript bignum, не выполнялась. Фактически, единственная реализация бигнама любого вида, которую я смог найти, - это Эдвард Мартин Калькулятор высокой точности JavaScript.

Ответ 3

Вместо этого используйте строку.

Ответ 4

179 - это один из способов взглянуть на него. Другим способом является то, что после первых 16 цифр любая дополнительная цифра равна 0. Я не знаю подробностей, но похоже, что ваша переменная хранит до 16 цифр.

Ответ 5

Это число превышает (2 ^ 31) -1 и что проблема; javascript использует 32-разрядные знаковые целые числа (то есть диапазон от -2,147,483,648 до 2,147,483,647). Ваш лучший выбор - использовать строки и создавать функции для управления строками в виде чисел.

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

Ответ 6

Одним из возможных решений является использование библиотеки BigInt, например: http://www.leemon.com/crypto/BigInt.html

Это позволит вам хранить целые числа произвольной точности, но это будет не так быстро, как стандартная арифметика.

Ответ 7

Так как он большой для хранения как int, он преобразуется в float. В JavaScript нет четких целых чисел и типов float, существует только универсальный тип Number.

Ответ 8

"Невозможно быстро увеличивать и уменьшать строку..."

Действительно?

function incr_num(x) {
   var lastdigit=Number(x.charAt(x.length-1));
   if (lastdigit!=9) return (x.substring(0,x.length-1))+""+(lastdigit+1);
   if (x=="9") return "10";
   return incr_num(x.substring(0,x.length-1))+"0";
}

function decr_num(x) {
   if(x=="0") return "(error: cannot decrement zero)";
   var lastdigit=Number(x.charAt(x.length-1));
   if (lastdigit!=0) return (x.substring(0,x.length-1))+""+(lastdigit-1);
   if (x=="10") return "9"; // delete this line if you like leading zero
   return decr_num(x.substring(0,x.length-1))+"9";
}

Ответ 9

Просто гадать, но, возможно, число хранится как плавающий тип, и разница может быть вызвана некоторой ошибкой округления. Если это так, то он может работать корректно, если вы используете другой интерпретатор (браузер или что-то еще, что вы его используете)