源于:https://raw.github.com/ruanyf/jstutorial/gh-pages/grammar/number.md 1. 根据国际标准IEEE 754,64位浮点数格式的64个二进制位中,第0位到第51位储存有效数字部分,第52到第62位储存指数部分,第63位是符号位,0表示正数,1表示负数。因此,JavaScript提供的有效数字的精度为53个二进制位(IEEE 754规定有效数字第一位默认为1,再加上后面的52位),也就是说,绝对值小于2的53次方的整数都可以精确表示。 问题: (出自:http://javascript-puzzlers.herokuapp.com/) var END = Math.pow(2, 53); var START = END - 100; var count = 0; for (var i = START; i <= END; i++) { count++; } console.log(count); it goes into an infinite loop, 2^53 is the highest possible number in javascript, and 2^53+1 gives 2^53, so i can never become larger than that. 解释: 2^53+1 = 2^53, 死循环 大于2^53的整数计算不能确保正确,但不一定总不正确 但 2^53+2 = 2^53 + 2 var END = Math.pow(2, 53); var START = END - 100; var count = 0; for (var i = START; i <= END; i += 2) { count++; } console.log(count); 输出51 2. JavaScript的数值有多种表示方法,可以用字面形式直接表示,也可以采用科学计数法表示,下面是两个科学计数法的例子。 以下两种情况,JavaScript会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。 (1)小数点前的数字多于21位。 1234567890123456789012 // 1.2345678901234568e+21 123456789012345678901 // 123456789012345680000 (2)小数点后的零多于5个。 0.0000003 // 3e-7 0.000003 // 0.000003 问题: parseInt(1111111111111111, 10) /^d+$/.test(1111111111111111) 1111111111111111 true parseInt(111111111111111111, 10) /^d+$/.test(111111111111111111) 111111111111111100 true parseInt(1111111111111111111111, 10) /^d+$/.test(1111111111111111111111) 1 false 解释: '1111111111111111111111'.length : 22 1111111111111111111111 自动转化为 1.1111111111111111e+21 parseInt(1.1111111111111111e+21, 10) -> 1 /^d+$/.test(1.1111111111111111e+21) -> false