在解决我之前的问题时,我遇到了更有趣的事情。
尝试整数数学(是的,我知道它们内部不是"太整数"(以查看有多少位可用:
var n = 0xffffffff;
// loop over 1P:
for(var i=1; i<=1024*1024*1024*1024; i*=16) {
var v=(n*i).toString(16);
console.log('i='+i+'; v='+v+' ('+v.length*4+')');
}
// Output:
// i=1; v=ffffffff (32)
// i=16; v=ffffffff0 (36)
// i=256; v=ffffffff00 (40)
// i=4096; v=ffffffff000 (44)
// i=65536; v=ffffffff0000 (48)
// i=1048576; v=ffffffff00000 (52)
// i=16777216; v=ffffffff000000 (56)
// i=268435456; v=ffffffff0000000 (60)
// i=4294967296; v=ffffffff00000000 (64)
// i=68719476736; v=ffffffff000000000 (68)
// i=1099511627776; v=ffffffff0000000000 (72)
// i=17592186044416; v=ffffffff00000000000 (76)
// i=281474976710656; v=ffffffff000000000000 (80)
即至少有 80 位可用...嘿嘿!
您很快就会得到一个"不可变的数字"!
n=0xffffffffffffffff // 64-bit wanted
18446744073709552000 // what? even decimal for odd hex?
n.toString(16)
"10000000000000000" // ooops...
n-1
18446744073709552000
n-2
18446744073709552000
n-4
18446744073709552000
那么,现在有多少位可用于JS风格的整数数学呢?
在 FireFox 51 64 位调试器中测试。
答案后再多一点插图:
var n = 0xffffffffffffffff;
for(var i=1; i<=1024*1024; i*=2){
console.log('i='+i+'; v='+(n/i-1).toString(16));
}
/* Output:
i=1; v=10000000000000000
i=2; v=8000000000000000
i=4; v=4000000000000000
i=8; v=2000000000000000
i=16; v=1000000000000000
i=32; v=800000000000000
i=64; v=400000000000000
i=128; v=200000000000000
i=256; v=100000000000000
i=512; v=80000000000000
i=1024; v=40000000000000
i=2048; v=1fffffffffffff
i=4096; v=fffffffffffff
i=8192; v=7ffffffffffff
i=16384; v=3ffffffffffff
i=32768; v=1ffffffffffff
i=65536; v=ffffffffffff
i=131072; v=7fffffffffff
i=262144; v=3fffffffffff
i=524288; v=1fffffffffff
i=1048576; v=fffffffffff
*/
您的计算不正确,因为仅仅因为整数 n 存在,并不意味着每个小于 n 的整数都存在。最大安全整数为 2^53 - 1
所以正确答案是:53位。
数字.MAX_安全_整数