Javascript не может правильно отобразить этот номер: 3494793310847464221
У меня есть интересный вопрос, я работал с javascript, и идентификатор базы данных вышел как "3494793310847464221", теперь он вводится в javascript как число, но использует число как другое значение, как при выводе в предупреждение и при передаче в другую функцию JavaScript.
Вот пример кода, чтобы показать ошибку в полной мере.
<html><head><script language="javascript">alert( 3494793310847464221);
var rar = 3494793310847464221;
alert(rar);
</script></head></html>
Это полностью сбило меня с толку, и на этот раз Google не мой друг...
Кстати, число на 179 больше, чем число там...
9 ответов
Ваше число больше максимально допустимого целочисленного значения в javascript (2^53). Ранее это уже было рассмотрено. Каково наибольшее целочисленное значение в JavaScript, на которое может пойти число без потери точности?
В JavaScript все числа (даже целые) хранятся как числа с плавающей точкой IEEE-754. Тем не менее, FP имеют ограниченную "точность" (см. Статью в Википедии для получения дополнительной информации), поэтому ваш номер не может быть точно представлен.
Вам нужно будет либо сохранить свой номер в виде строки, либо использовать какой-то другой подход "bignum" (к сожалению, я не знаю ни одной библиотеки JS bignum, которая бы мне нравилась).
Изменить: После небольшой копки, кажется, что было много работы над библиотеками JavaScript bignum. Фактически, единственная реализация bignum любого вида, которую мне удалось найти, - это высокоточный калькулятор Эдварда Мартина на JavaScript.
Еще 179 - это один из способов взглянуть на это. Другой способ заключается в том, что после первых 16 цифр любая последующая цифра равна 0. Я не знаю деталей, но, похоже, ваша переменная хранит только до 16 цифр.
Это число превышает (2^31)-1, и это проблема; javascript использует 32-разрядные целые числа со знаком (то есть диапазон от –2 147 483 648 до 2 147 483 647). Лучший выбор - использовать строки и создавать функции для работы со строками в виде чисел.
Я не был бы слишком удивлен, если бы уже была библиотека, которая делает то, что вам нужно.
Одним из возможных решений является использование библиотеки BigInt, такой как: http://www.leemon.com/crypto/BigInt.html
Это позволит вам хранить целые числа произвольной точности, но это будет не так быстро, как стандартная арифметика.
Поскольку он должен храниться как int, он конвертируется в float. В JavaScript нет явных целочисленных и плавающих типов, есть только универсальный тип Number.
"Невозможно легко увеличить или уменьшить строку..."
В самом деле?
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") вернуть "10"; return incr_num(x.substring(0,x.length-1))+"0"; } function decr_num(x) { if(x=="0") return "(error: не может уменьшить ноль)"; var lastdigit=Number(x.charAt(x.length-1)); if (lastdigit!=0) return (x.substring(0,x.length-1))+""+(lastdigit-1); if (x=="10") вернуть "9"; // удаляем эту строку, если вам нравится ведущий ноль return decr_num (x.substring (0, x.length-1))+"9"; }
Просто догадываюсь, но, возможно, число хранится как плавающий тип, и разница может быть из-за некоторой ошибки округления. Если это так, то он может работать правильно, если вы используете другой интерпретатор (браузер или любой другой, в котором вы его используете)