【问题标题】:Convert exponential number to a whole number in javascript在javascript中将指数数转换为整数
【发布时间】:2012-12-26 08:00:10
【问题描述】:

我需要在 url 中使用 23 位数字。我正在使用 Math.random() 生成数字,但我得到指数形式的结果。

我的代码是

var id = (Math.random()*11111111111111111111111).toFixed(23);

但我得到的结果是6.286119436349295e+21

如何将“id”中的随机值存储为整数?

【问题讨论】:

  • 'digit',应该是十进制数吧?

标签: javascript math random


【解决方案1】:

JavaScript 可以连续表示 -9007199254740992 和 9007199254740992 之间的整数。它实际上 可以 表示更大(和更小)的整数,但不是全部!事实上,在 9007199254740992 之后的“下一个”整数是 9007199254740994。它们有一段时间是 2,然后变成 4,然后是 8,依此类推。正如您所注意到的,当它们变得非常大时,它们会以科学计数法显示。即使toFixed 的结果也不能保证以仅由数字组成的形式显示。

因此,当您计算 23 个十进制数字范围内的整数时,您将无法使用 JavaScript 的原生 Number 类型(IEEE-754 64 位)来表示其中的一堆。

如果您不关心随机数的特定分布,字母表上的随机字符串 0..9 可以工作,也可以将较小的整数粘贴在一起,但如果您正在寻找那么你应该(如 Ignacio Vasquez-Abrams 所建议的)使用支持任意长度精度的库。

【讨论】:

    【解决方案2】:

    JavaScript 数字对此不够精确。您将永远无法获得完整的 23 个随机数字。获取几个较小的数字并将它们作为字符串粘贴在一起会更容易。

    【讨论】:

      【解决方案3】:

      你不能;它甚至不适合 64 位整数,更不用说 32 位整数了。使用任意长度的整数库。

      【讨论】:

      • 你推荐哪一个?
      【解决方案4】:

      将数字分成两部分并将它们组合成一个字符串。

      var id1 = Math.floor( Math.random() * 10e10 ); // 11 digits
      var id2 = Math.floor( Math.random() * 10e11 ); // 12 digits
      
      var id = id1+''+id2;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-04
        • 2020-04-21
        • 2021-02-13
        • 1970-01-01
        • 2013-04-30
        相关资源
        最近更新 更多