• 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
    

      

  • 相关阅读:
    数据结构----------------优先队列
    IDEA建立---- java web项目
    mysql 基础篇5(mysql语法---数据)
    数据库 基础篇4(mysql语法---表)
    数据库 基础篇3(mysql语法)
    数据库 基础篇2(mysql)
    vi保存搜索结果
    自定义修改connect rule
    xargs 的应用
    nfs,nis nobody的问题
  • 原文地址:https://www.cnblogs.com/frostbelt/p/3544904.html
Copyright © 2020-2023  润新知