js 的数值限制可能引起的问题

源于: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

  

你可能感兴趣的:(js)