【问题标题】:Javascript can't render this number correctly: 3494793310847464221Javascript 无法正确呈现此数字:3494793310847464221
【发布时间】:2010-10-17 20:38:13
【问题描述】:

我有一个有趣的问题,我一直在使用 javascript 进行一些工作,并且数据库 ID 显示为“3494793310847464221”,现在这是作为数字输入到 javascript 中但它使用该数字作为不同的值,两者当输出到警报和传递到另一个 javascript 函数时。

这里有一些示例代码可以充分显示错误。

<html><head><script language="javascript">alert( 3494793310847464221);
var rar =  3494793310847464221;
alert(rar);
</script></head></html>

这完全让我感到困惑,这一次谷歌不是我的朋友......

顺便说一句,这个数字比那里的数字多 179...

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您的数字大于 javascript (2^53) 中允许的最大整数值。 What is JavaScript's highest integer value that a Number can go to without losing precision? 之前已经报道过这个问题

    【讨论】:

    • 这不是真的;有更大的整数是“允许的”(只要它们可以表示为 64 位浮点数)。这里的相关信息是javascript数字是浮点数,如您链接到的帖子中所述,而不是整数。
    【解决方案2】:

    在 JavaScript 中,所有数字(甚至整数)都存储为 IEEE-754 浮点数。但是,FP 的“精度”有限(有关详细信息,请参阅 Wikipedia article),因此您的数字无法准确表示。

    您将需要将您的号码存储为字符串或使用其他一些“bignum”方法(不幸的是,我不知道有任何 JS bignum 库在我脑海中浮现)。

    编辑: 在进行了一些挖掘之后,似乎并没有以 JavaScript bignum 库的方式完成大量工作。事实上,我能找到的唯一一种 bignum 实现是 Edward Martin 的 JavaScript High Precision Calculator

    【讨论】:

    【解决方案3】:

    改用字符串。

    【讨论】:

      【解决方案4】:

      179 更多是一种看待它的方式。另一种方法是,在前 16 位之后,任何其他数字都是 0。我不知道详细信息,但看起来您的变量最多只能存储 16 位。

      【讨论】:

        【解决方案5】:

        这个数字超过了 (2^31)-1,这就是问题所在; javascript 使用 32 位有符号整数(意思是,范围从 –2,147,483,648 到 2,147,483,647)。您最好的选择是使用字符串,并创建函数将字符串作为数字进行操作。

        如果已经有一个库可以满足您的需求,我不会感到惊讶。

        【讨论】:

        • 这与 javascript 数字是 64 位浮点数的说法如何匹配?
        • @xtofl:双精度浮点值可以准确表达32位整数的范围;此外,位运算符是使用数字的整数表示定义的,因此有时 JS 数字的行为类似于整数,但内在类型是浮点
        【解决方案6】:

        一种可能的解决方案是使用 BigInt 库,例如:http://www.leemon.com/crypto/BigInt.html

        这将允许您存储任意精度的整数,但它不会像标准算术那样快。

        【讨论】:

          【解决方案7】:

          由于存储为 int 太大,因此将其转换为 float。在 JavaScript 中没有明确的整数和浮点类型,只有通用的数字类型。

          【讨论】:

          • javascript 没有整数
          • @mkoryak: true,但浮点值会在需要时隐式转换为整数
          【解决方案8】:

          “不能轻易地增加和减少一个字符串......”

          真的吗?

          函数 incr_num(x) { var lastdigit=Number(x.charAt(x.length-1)); if (lastdigit!=9) return (x.substring(0,x.length-1))+""+(lastdigit+1); 如果 (x=="9") 返回 "10"; 返回 incr_num(x.substring(0,x.length-1))+"0"; } 函数 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); 如果 (x=="10") 返回 "9"; // 如果您喜欢前导零,请删除此行 return decr_num(x.substring(0,x.length-1))+"9"; }

          【讨论】:

            【解决方案9】:

            只是猜测,但也许数字存储为浮点类型,差异可能是因为一些舍入误差。如果是这种情况,如果您使用另一个解释器(浏览器,或者您正在运行它的任何工具),它可能会正常工作

            【讨论】:

              猜你喜欢
              • 2015-03-20
              • 1970-01-01
              • 2023-03-28
              • 2014-03-19
              • 2015-03-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多