首页 新闻 会员 周边 捐助

JS数学坑题

0
悬赏园豆:20 [已关闭问题] 关闭于 2015-04-27 19:32
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存储数据的方式,所以特地求助下

xingoo的主页 xingoo | 小虾三级 | 园豆:711
提问于:2015-04-27 16:06
< >
分享
所有回答(2)
1

有意思,刚实验了下,当i 为 END的值时,i++就不执行了。

519740105 | 园豆:5810 (大侠五级) | 2015-04-27 17:03

再做实验,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是从哪里来的(非常感兴趣)。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2015-04-27 18:19

是啊...for循环直接卡死...

支持(0) 反对(0) xingoo | 园豆:711 (小虾三级) | 2015-04-27 18:20

@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);
支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2015-04-27 18:22

@519740105: 额 就是面试题集上面的,我也不清楚这个53有什么特殊的。的确2的53次幂 就是一个分界线...

支持(0) 反对(0) xingoo | 园豆:711 (小虾三级) | 2015-04-27 18:26
0

找到问题的答案了,就是因为浮点数精度最大数为2的53次幂

 

xingoo | 园豆:711 (小虾三级) | 2015-04-27 19:32

这个是一个说法,如果是小数,很好理解(虽然没记下52位位精度)。

但是,这里的START和END应该表示为LONG才对吧?

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2015-04-28 09:08

@519740105: JS里面没有LONG型的,存储都是一样存储,只是使用时会自动转换成parseInt或者parseFloat。

支持(0) 反对(0) xingoo | 园豆:711 (小虾三级) | 2015-04-28 10:17

@xingoo: double也没有?那也就正常了,使用浮点来表示。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2015-04-28 10:29

@519740105: 恩,JS的数据类型比较少,数字都是属于number类型。

支持(0) 反对(0) xingoo | 园豆:711 (小虾三级) | 2015-04-28 10:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册