#javascript #parseint
#javascript #синтаксический анализ
Вопрос:
Рассмотрим:
<html>
<body>
<input Id="1"></input>
<input Id="2"></input>
<button Id="3"onclick="add()">Add</button>
<script>
function add()
{
var num1 = document.getElementById("1").value;
var val1 = parseInt(num1);
var num2 = document.getElementById("2").value
var val2 = parseInt(num2);
var val3 = val1 val2;
var x = num1 num2;
alert(val3);
</script>
</body>
</html>
Я хочу добавить два числа в JavaScript. Но когда я предоставляю ‘11111111111111111’ в текстовое поле, parseInt преобразует его в 1111111111111111112 вместо 111111111111111111111. Почему он это делает?
Я перепробовал все методы. Сначала я преобразовал var в string и проанализировал его в int, затем добавил, использовал другой радиус с помощью parseInt, но я все равно ничего не получаю.
Я также отметил, что когда я предоставляю ему 16 1, он работает нормально, но с 17 1 он делает это.
Комментарии:
1. Правильный формат синтаксического анализа — с помощью radix. т.е.
parseInt(value, 10)
Здесь radix10
для десятичных чисел. По умолчанию некоторые браузеры предполагают, что основание является восьмеричным, т.е.8
Подробнее читайте здесь .2. Я пробовал, но все равно он дает тот же результат, т.е. 1111111111111111112
3. @Mr_Green Некоторые браузеры не предполагают, что основание является восьмеричным, если только строка не начинается с 0, что здесь не так. И восьмеричное число 11111111111111111, конечно, не 1111111111111111112.
4. @Mr_Green нет,
'11111111111111111' 0
(неявноеparseInt
использование) также дает
11111111111111112
(по крайней мере, в Chrome).5. @Mr_Green Вы не можете обойти потерю точности, независимо от того, какую арифметику вы применяете к числам. Обратите внимание на это
11111111111111111 === 11111111111111112 // true
. Попробуйте протестировать свои «решения» перед их публикацией…
Ответ №1:
Числа JavaScript — это двойные значения IEEE 754, которые имеют точность 15-17 значащих цифр.
В вашем случае 11111111111111111
число состоит из 17 цифр, что вызывает наблюдаемые проблемы.