var END = Math.pow(2,53); var START = END - 100; // alert([END,START,Math.pow(2,63)]);//END:90071992547400992 var count = 0; for( var i = START ; i<=END ; i++){ count++; //console.log(count); } alert(count);
我测试的代码,一直死循环了。
i就是跳不出来...很奇怪,因为不太了解JS存储数据的方式,所以特地求助下
有意思,刚实验了下,当i 为 END的值时,i++就不执行了。
再做实验,2^53是一个坎。
如果END = Math.pow(2, 53)-1,则没问题,再往上,则不可以:
直接53:到i=END时,不能再对i执行+操作。
直接54:第一个数是START,第二个数是 START+2,然后一直这个数。
而且:2^54 = a, 那么2 ^ 54 - 1 = 2 ^ 54 - 10 + 2
然后,2 ^ 54 +/- 1 都是一个固定的偶数。
应该问题的关键点是:JS里,最大的整数是 2 ^ 53,不知道你这个53是从哪里来的(非常感兴趣)。
是啊...for循环直接卡死...
@xingoo: 你的代码因为一直在 i=END这个值,i++始终为END。
我的测试代码:
var END = Math.pow(2,53) - 1; var START = END - 10; alert(END + "," + START); alert(END-START); // alert([END,START,Math.pow(2,63)]);//END:90071992547400992 var count = 0; for( var i=START; i<=END; ){ alert(i); if(count > 13) break; i+=1; count++; //console.log(count); } alert(count);
@519740105: 额 就是面试题集上面的,我也不清楚这个53有什么特殊的。的确2的53次幂 就是一个分界线...
找到问题的答案了,就是因为浮点数精度最大数为2的53次幂
这个是一个说法,如果是小数,很好理解(虽然没记下52位位精度)。
但是,这里的START和END应该表示为LONG才对吧?
@519740105: JS里面没有LONG型的,存储都是一样存储,只是使用时会自动转换成parseInt或者parseFloat。
@xingoo: double也没有?那也就正常了,使用浮点来表示。
@519740105: 恩,JS的数据类型比较少,数字都是属于number类型。