Ответ 1
Ваше число больше максимального допустимого целочисленного значения в javascript (2 ^ 53). Ранее это охватывалось Что такое максимальное целочисленное значение JavaScript, которое Number может идти без потери точности?
У меня есть интересный вопрос: я выполнял некоторую работу с javascript, и идентификатор базы данных вышел как "3494793310847464221", теперь это вводится в javascript как число, но оно использует число как другое значение, как при выводе на предупреждение и при передаче в другую функцию javascript.
Вот пример кода, чтобы показать полную ошибку.
<html><head><script language="javascript">alert( 3494793310847464221);
var rar = 3494793310847464221;
alert(rar);
</script></head></html>
Это полностью забеспокоило меня, и на этот раз Google не мой друг...
btw число на 179 больше, чем число там...
Ваше число больше максимального допустимого целочисленного значения в javascript (2 ^ 53). Ранее это охватывалось Что такое максимальное целочисленное значение JavaScript, которое Number может идти без потери точности?
В JavaScript все числа (даже интегральные) хранятся в виде чисел с плавающей запятой IEEE-754. Однако FP имеют ограниченную "точность" (см. статью Википедии для получения дополнительной информации), поэтому ваш номер не может быть точно представлен.
Вам нужно либо сохранить свой номер в виде строки, либо использовать какой-либо другой подход "bignum" (к сожалению, я не знаю каких-либо библиотек JS bignum с верхней части моей головы).
Изменить:. После небольшого копания, похоже, что большая часть работы, выполняемой библиотеками JavaScript 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 нет четких целых чисел и типов float, существует только универсальный тип 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") 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"; }
Просто гадать, но, возможно, число хранится как плавающий тип, и разница может быть вызвана некоторой ошибкой округления. Если это так, то он может работать корректно, если вы используете другой интерпретатор (браузер или что-то еще, что вы его используете)