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

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值