这个javascript表达式的最高和最低结果?

时间:2010-09-22 01:33:02

标签: javascript floating-point

这个javascript表达式可以评估的最高数字是多少?最低的数字是多少?为什么呢?

+(''+Math.random()).substring(2)

额外信用:表达式可以评估多少个不同的值?可以是从最小值到最大值的每个值,还是由于舍入问题而无法获得的某些中间值?


对Daniel的回答(已删除,最多为10000000000000000,0分钟):

我在Chrome的控制台中玩游戏并得到了这个:

    Math.random();

>> 0.00012365682050585747

    '12365682050585747'.length

>> 17

    12365682050585747 > 10000000000000000

>> true

...所以10000000000000000不能是最大的!

2 个答案:

答案 0 :(得分:3)

这取决于如何生成随机数,以及如何将数字转换为字符串。 ECMAScript规范没有指定这两者。

实际上,这个数字最多只能有17个有效数字,所以最大值应该是10 17

规范确实指出当指数介于-6和20之间时,数字将以十进制形式(而不是科学形式)显示(10 -6 ≤x<10 21 ),所以我们只需要在尝试最大限度地寻求最大值时,将注意力限制在[10 -6 ,1)中的数字。

但是,在此范围内,数字必须可表示为 s ×2 e ,其中1≤ s ≤2 - 2 -52 ,精度为Δ s = 2 -52 和-20≤ e ≤-1。规范建议使用ToNumber(ToString(x)) == x,因此对于给定的 e ,数字应该精确到2 -52+ e 。因此,“17位”数字(2 - n ×2 -52 )×2 e 在切断初始0.之后,最小的 n 将是使用给定 e 表示的最大数字。

             v                 
(-20) 0.0000019073486328124998
(-19) 0.0000038146972656249996
(-18) 0.0000076293945312499975 (n=3)
(-17)  0.000015258789062499998
(-16)  0.000030517578124999997
(-15)  0.000061035156249999986 (n=2)
(-14)   0.00012207031249999999
(-13)   0.00024414062499999997
(-12)   0.00048828124999999995
(-11)    0.0009765624999999999 (always 16-digit?)
(-10)    0.0019531249999999998
(-9)     0.0039062499999999996
(-8)     0.0078124999999999965 (n=4)
(-7)      0.015624999999999998
(-6)      0.031249999999999997
(-5)      0.062499999999999986 (n=2)
(-4)       0.12499999999999999
(-3)       0.24999999999999997
(-2)       0.49999999999999994
(-1)        0.9999999999999999 (always 16-digit?)

从这里我们知道绝对最大值 78,124,999,999,999,965


Math.random()可以返回区间[0,1]中的任何非负数,因此安全最小值是5e-324的-324(双精度中最小的次正规数是4.94×10 -324 )。

答案 1 :(得分:2)

对我来说,最高的数字是1/0(=== Infinity),最低的数字是-1/0(在Chromium浏览器中)。

编辑:你也可以尝试从字符串中解析一个数字,看看哪个评估为无穷大。

var a = "1";
while(parseInt(a)!==Infinity) a=a+"0";
alert("Length of the highest number is: " + (a.length-1));

309对我来说。