【问题标题】: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”中的随机值存储为整数?
【问题讨论】:
标签:
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;