这个javascript表达式可以评估的最高数字是多少?最低的数字是多少?为什么呢?
+(''+Math.random()).substring(2)
额外信用:表达式可以评估多少个不同的值?可以是从最小值到最大值的每个值,还是由于舍入问题而无法获得的某些中间值?
对Daniel的回答(已删除,最多为10000000000000000,0分钟):
我在Chrome的控制台中玩游戏并得到了这个:
Math.random();
>> 0.00012365682050585747
'12365682050585747'.length
>> 17
12365682050585747 > 10000000000000000
>> true
...所以10000000000000000不能是最大的!
答案 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对我来说。