关于数值:
根据国际标准IEEE754,64位浮点数格式的64个二进制位中,第0到51位存储有效数字部分(共52位),第52位到62位储存指数部分,第63位是符号位,0表示正数,1表示负数。
因此,JavaScript提供的有效数字的精度为53个二进制位(IEEE 754规定有效数字第一位默认总是为1,不保存在64位浮点数之中,这一位再加上后面的52位,就是总共53位),也就是说,绝对值小于2的53次方的整数,即-(253-1)到253-1,都可以精确表示。
Math.pow(2, 53)// 9007199254740992Math.pow(2, 53) + 1// 9007199254740992Math.pow(2, 53) + 2// 9007199254740994Math.pow(2, 53) + 3// 9007199254740996Math.pow(2, 53) + 4// 9007199254740996
指数部分长度是11个二进制位,意味着指数部分最大值是2047,去掉一半给负数,则能表示的最大数为2^1024到2^-1023(开区间)
小数点前数字多余21位的或小数点0的个数多余5个的时候会自动转为科学技术法,此时的parseInt会有点小bug,会将转换为科学计数法视为字符串把e及之后的省略掉。
parseInt第二个参数是进制数,只能是2-36之间的数字。第一个数字必须是字符串,否则会先转换成字符串,如果此时第一个数字中有0、0x之类的就会出现问题。
parseInt(0x11, 36) // 43// 等同于parseInt(String(0x11), 36)parseInt('17', 36)
x本来应该被翻译成33,但是测试被当成0x前缀所以出了问题。
参考:
http://javascript.ruanyifeng.com/grammar《JavaScript标准参考教程(alpha)》阮一峰