Неправильный синтаксический анализ JavaScript для преобразования

#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) Здесь radix 10 для десятичных чисел. По умолчанию некоторые браузеры предполагают, что основание является восьмеричным, т.е. 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 цифр, что вызывает наблюдаемые проблемы.