JavaScript parseInt 错误转换

3

请考虑:

<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将其转换为11111111111111112而不是11111111111111111。为什么会这样呢?
我尝试了所有的技巧。我首先将变量转换为字符串,然后将其解析为int进行相加,使用了不同的基数用于parseInt,但是我仍然得不到正确的结果。
我还注意到,当我向其中提供16个1时,它能够正常工作,但是如果提供17个1,则会出现上述问题。

2
parseInt的正确格式需要指定进制。例如:'parseInt(value, 10)'。在这里,十进制数的进制是10。默认情况下,一些浏览器会将进制认为是八进制,即8。详见此处 - Mr_Green
2
@Mr_Green 一些浏览器不会默认将基数设为八进制,除非字符串以0开头,但这里并非如此。而八进制的11111111111111111肯定不是11111111111111112。 - JJJ
@rao 不要使用 parseInt。试着用这个:var val3 = val1 - - val2; var x = num1 - - num2; - Mr_Green
1
@Mr_Green 不,+'11111111111111111' + 0(隐式使用+parseInt)在至少 Chrome 中也会得出 11111111111111112 - pawel
2
@Mr_Green 无论你对数字应用什么算术运算,都无法避免精度丢失。请注意11111111111111111 === 11111111111111112 // true。在发帖之前,请尝试测试您的“解决方案”... - JJJ
显示剩余4条评论
1个回答

7

JavaScript数字IEEE 754双精度浮点数,具有15-17位有效数字的精度。

在您的情况下,11111111111111111这个数字有17位数字,导致观察到的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接